递归的正则表达式

时间:2012-07-02 18:34:16

标签: regex regular-language

我正在尝试构建一个正则表达式,我被要求过滤字符串

country:India provinces:Uttranchal city:Dehradun zip_code:12345

来自像这样的字符串

keyword: one two three country:India provinces:Uttranchal city:Dehradun zip_code:12345 filter: myparameter

现在我准备了一个像

这样的基本正则表达式
country:\w+|provinces:\w+|city:\w+|zip_code:\w+

如果countryprovincescity是单个字,那么对我来说有什么用呢

但如果他们不是 示例

keyword: one two three country:United-States provinces:Manhattan city:New-York zip_code:12345 filter: myparameter

由于-

等非单词字符的限制,上述要求无法正常工作

您可以假设国家/地区,省或城市都有许多-

加入的单词

country:United-States-of-America provinces:Washington-Dc city:New-York-West

等 等...

所以-\w+是一种递归模式,countryprovincescity或所有这些模式中出现0或更多

现在我也尝试为这样的东西构建一个正则表达式

(country:\w+(-\w+)*)|(province:\w+(-\w+)*)|(city:\w+(-\w+)*)|(zip_code:\w+(-\w+)*)

这虽然匹配 但正如你在rubular screenshot中所看到的那样,它还提供了不接受的输出和nil

我想要的是避免non-acceptednil输出,当从给定的输入字符串中分离所需的字符串时,会导致匹配结果出现问题,或者有人建议我使用比此更好的正则表达式

2 个答案:

答案 0 :(得分:0)

(...)是捕获组。 Ruby(如果你正在使用它)也支持非捕获组(?:...),所以我认为你想要:

(country:\w+(?:-\w+)*)|(province:\w+(?:-\w+)*)|(city:\w+(?:-\w+)*)|(zip_code:\w+(?:-\w+)*)

甚至:

(country:\w+(?:-\w+)*|province:\w+(?:-\w+)*|city:\w+(?:-\w+)*|zip_code:\w+(?:-\w+)*)

如果您希望它们都在捕获组1中。

答案 1 :(得分:0)

如果您想匹配一组一个或多个字母和短划线,您只需使用括号表示character set[\w\-]+

country:[\w\-]+|provinces:[\w\-]+|city:[\w\-]+|zip_code:[\w\-]+

Python中的两行示例:

>>> s = "keyword: one two three country:United-States provinces:Manhattan city:New-York zip_code:12345 filter: myparameter"
>>> print re.findall("country:[\w\-]+|provinces:[\w\-]+|city:[\w\-]+|zip_code:[\w\-]+", s)
['country:United-States', 'provinces:Manhattan', 'city:New-York', 'zip_code:12345']