谁能解释一下regex/(.*)\(.*)/?

谁能解释一下regex/(.*)\(.*)/?,regex,Regex,我想在Groovy中使用正则表达式获取文件扩展名,比如South.6987556.Input.csv.cop 向我展示了第二组将真正包含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,2

我想在Groovy中使用正则表达式获取文件扩展名,比如
South.6987556.Input.csv.cop

向我展示了第二组将真正包含
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

要获得这种结果,正则表达式应该是什么?

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

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

查看演示站点右下角捕获的组

说明:

(         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

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

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

查看演示站点右下角捕获的组

说明:

(         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

这里是这个正则表达式的可视化

(.*)\.(.*)

用词

  • (.*)
    匹配尽可能大的任何内容并引用它
  • \.
    匹配一个句点,无参考(无括号)
  • (.*)
    再次匹配任何内容,可能为空,并引用它
在你的情况下,这是

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


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

这里是该正则表达式的可视化

(.*)\.(.*)

用词

  • (.*)
    匹配尽可能大的任何内容并引用它
  • \.
    匹配一个句点,无参考(无括号)
  • (.*)
    再次匹配任何内容,可能为空,并引用它
在你的情况下,这是

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


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

原因是(.*)是“贪婪的”-它将吞噬尽可能多的字符。要使其不贪婪,请添加一个问号<代码>(.*)\(.*)@AvinashRaj它在标题中。最后一个
是否属于正则表达式?你为什么不和我一起玩?请看@阿维纳什拉吉:没有?不是reg exp的一部分。我更新了标题。原因是(.*)是“贪婪的”-它将吞噬尽可能多的字符。要使其不贪婪,请添加一个问号<代码>(.*)\(.*)@AvinashRaj它在标题中。最后一个
是否属于正则表达式?你为什么不和我一起玩?请看@阿维纳什拉吉:没有?不是reg exp的一部分。我更新了标题,它仍然允许像以前一样,有一个扩展名为en空的文件名argh。。。正确的。。。我忘记了
*
,想到了
+
。。。sry。。。你是right@bukart它不会捕获整个字符串。与标题中更新的正则表达式相对应的更新的我的Answer主要是关于所需且运行良好的reg exp
(.*)\(.*)
的解释。谢谢。不,它仍然允许像以前一样,有一个扩展名为en空的文件名argh。。。正确的。。。我忘记了
*
,想到了
+
。。。sry。。。你是right@bukart它不会捕获整个字符串。与标题中更新的正则表达式相对应的更新的我的Answer主要是关于所需且运行良好的reg exp
(.*)\(.*)
的解释。非常感谢。