有人可以解释正则表达式/(.*)\.(.*)/?

时间:2014-07-28 06:05:01

标签: regex

我想用正则表达式在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

获得此类结果的正则表达式应该是什么?

2 个答案:

答案 0 :(得分:2)

要获得所需的输出,你的正则表达式应该是:

((.*?)\.(.*))

DEMO

查看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)

以下是此正则表达式的可视化

(.*)\.(.*)

Regular expression visualization

Debuggex Demo

用文字

  • (.*)匹配尽可能大的任何内容并引用它
  • \.匹配一个期间,没有引用(无括号)
  • (.*)再次匹配任何内容,可能为空,并引用它

在你的情况下这是

  • (.*)South.6987556.Input.csv
  • \..
  • (.*)cop

它不仅仅是South6987556.Input.csv.cop,因为第一部分(.*)不是可选的,而是贪婪的,必须后跟句点,因此引擎会尝试匹配最大可能的字符串。

您的预期结果将由此正则表达式创建:(.*?)\.(.*)。量词之后的?(在这种情况下为*)将引擎的行为切换为ungreedy,因此将搜索最小的匹配字符串。默认情况下,大多数正则表达式引擎都是贪心的。