RegEx捕获组,其中分隔符可以出现在组中

时间:2018-08-20 22:45:04

标签: regex

我需要一个能捕获以下内容的正则表达式:

foo-bar-fort-worth-tx

1st group: (foo-bar) 2nd group: (fort-worth) 3rd group: (tx)

我遇到麻烦了,因为定界符“-”也可能出现在捕获组中。幸运的是,我认为每个捕获组中最多只能有一个“-”。

这是我的正则表达式:

^(.+)-(.+)-[a-zA-Z]{2}$

但是,它没有按预期运行。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

图案中有一些错误。当使用(.+)之类的捕获组时,由于.的贪婪,正则表达式将尝试并匹配(捕获)任何内容(+)。有关模式,请参见debugger too,然后检查here。由于它匹配任何内容,因此将匹配到字符串末尾。然后,该模式要求输入-,因此正则表达式必须回溯直到找到-,然后停止。因此,您最终得到:

Group 1.    0-18    `foo-bar-fort-worth` 

使用以下使用否定字符集的表达式来匹配并捕获您描述的模式:

^([^-]+-[^-]+)-([^-]+-[^-]+)-(.*)$

您可以{{3}}试试。

Group 1.    0-7     `foo-bar`
Group 2.    8-18    `fort-worth`
Group 3.    19-21   `tx`