我正在从格式为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条答案
按热度按时间rjzwgtxy1#
当您在Groovy中使用
=~
操作符找到正则表达式匹配时,您可以使用fileMatch[0]
获得完整匹配-如果模式中没有捕获组,或者使用完整匹配和“捕获”子字符串的列表(如果您在模式中指定了捕获组)。如果您删除捕获组(即,如果您删除捕获括号,
([^_]+)
=>[^_]+
),则使用字符串
您可以使用
fileMatch[0]
获取整个匹配文本。使用
fileMatch.size()
,您可以检查在您的模式中是否有那些带有显式捕获组的“捕获”子字符串。因此,如果有捕获组,您将能够通过fileMatch[0][0]
,fileMatch[0][1]
等访问它们。请注意,“组”的数量是模式中捕获组的数量+1(整个匹配值的组)。
bxpogfeg2#
不确定其复杂性,但
\(ID.*)(\..*)\
可以完成这项工作