groovy 正则表达式匹配器返回多个值

0ve6wy6x  于 2024-01-06  发布在  其他
关注(0)|答案(2)|浏览(88)

我正在从格式为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]提取第一个匹配,但我想知道我是否做错了什么。
我也试过(?<=_)([^_]+)(?=\.[^.]+$),结果也一样。

rjzwgtxy

rjzwgtxy1#

当您在Groovy中使用=~操作符找到正则表达式匹配时,您可以使用fileMatch[0]获得完整匹配-如果模式中没有捕获组,或者使用完整匹配和“捕获”子字符串的列表(如果您在模式中指定了捕获组)。
如果您删除捕获组(即,如果您删除捕获括号,([^_]+) => [^_]+),则使用

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

字符串
您可以使用fileMatch[0]获取整个匹配文本。
使用fileMatch.size(),您可以检查在您的模式中是否有那些带有显式捕获组的“捕获”子字符串。因此,如果有捕获组,您将能够通过fileMatch[0][0]fileMatch[0][1]等访问它们。
请注意,“组”的数量是模式中捕获组的数量+1(整个匹配值的组)。

bxpogfeg

bxpogfeg2#

不确定其复杂性,但\(ID.*)(\..*)\可以完成这项工作

相关问题