我想用正则表达式在Groovy中获取文件扩展名,比方说South.6987556.Input.csv.cop
。
http://www.regexplanet.com/advanced/java/index.html告诉我第二组确实包含cop
扩展名。这就是我想要的。
0: [0,27] South.6987556.Input.csv.cop
1: [0,23] South.6987556.Input.csv
2: [24,27] cop
我只是不明白为什么结果不会
0: [0,27] South.6987556.Input.csv.cop
1: [0,23] South
2: [24,27] 6987556.Input.csv.cop
获得此类结果的正则表达式应该是什么?
答案 0 :(得分:2)
要获得所需的输出,你的正则表达式应该是:
((.*?)\.(.*))
查看DEMO网站右下角的已捕获组。
<强>解释强>
( group and capture to \1:
( group and capture to \2:
.*? any character except \n (0 or more
times) ? after * makes the regex engine
to does a non-greedy match(shortest possible match).
) end of \2
\. '.'
( group and capture to \3:
.* any character except \n (0 or more
times)
) end of \3
) end of \1
答案 1 :(得分:2)
以下是此正则表达式的可视化
(.*)\.(.*)
用文字
(.*)
匹配尽可能大的任何内容并引用它\.
匹配一个期间,没有引用(无括号)(.*)
再次匹配任何内容,可能为空,并引用它在你的情况下这是
(.*)
:South.6987556.Input.csv
\.
:.
(.*)
:cop
它不仅仅是South
和6987556.Input.csv.cop
,因为第一部分(.*)
不是可选的,而是贪婪的,必须后跟句点,因此引擎会尝试匹配最大可能的字符串。
您的预期结果将由此正则表达式创建:(.*?)\.(.*)
。量词之后的?
(在这种情况下为*
)将引擎的行为切换为ungreedy,因此将搜索最小的匹配字符串。默认情况下,大多数正则表达式引擎都是贪心的。