代码之家  ›  专栏  ›  技术社区  ›  manuel_b

Regex匹配器返回多个值

  •  0
  • manuel_b  · 技术社区  · 2 年前

    我正在从具有格式的文件名中提取子字符串 xxxxx_ID.extension

    正确匹配的字符串示例:

    aaaa_bbbb_ID1.txt
    xxxxxx_yy_ID2.xml
    xxxx_ID3.zzz
    

    我需要身份证部分。我试过了

    def fileMatch = ("aaaa_bbbb_ID1.txt" =~ /(?<=_)([^_]+)(?=\.\w+$)/);
    assert fileMatch.size() > 0
    println fileMatch[0]
    

    哪里:

    • (?<=_) 匹配最后一个下划线
    • ([^_]+) 与要提取的ID匹配(内部没有下划线的字符串)
    • (?=\.\w+$) 以匹配 扩大

    它返回 [ID1, ID1] 。这里我只期望一个结果,为什么它与ID匹配两次?

    我知道我可以用 fileMatch[0][0] 但我想知道我是不是做错了什么。

    我也试过 (?<=_)([^_]+)(?=\.[^.]+$) 具有相同的结果。

    2 回复  |  直到 2 年前
        1
  •  1
  •   Wiktor Stribiżew    2 年前

    当您发现正则表达式与匹配时 =~ 运算符,您可以使用 fileMatch[0] -如果模式中没有捕获组,或者包含整个匹配和“捕获”子字符串的列表(如果您在模式中指定了捕获组)。

    如果移除捕获组(即,如果移除捕获括号, ([^_]+) => [^_]+ )使用

    /(?<=_)[^_]+(?=\.\w+$)/
    

    您可以使用获取整个匹配文本 fileMatch[0] .

    具有 fileMatch.size() ,检查模式中是否存在具有显式捕获组的“捕获”子字符串。因此,如果有捕获组,您将能够通过访问它们 fileMatch[0][0] , fileMatch[0][1]

    请注意,“组”的数量是模式中捕获组的数量+1(整个匹配值的一个组)。

        2
  •  -1
  •   Arnaldo Cícero Bezerra    2 年前

    不确定其复杂性,但是 \(ID.*)(\..*)\ 可以做这份工作