0

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

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+

country如果, provinces,city是单个词,哪种对我有用

但如果他们不是例子

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

由于非单词字符的限制,上述 reqex 不起作用-

您可以假设国家,省或城市,并有许多加入的词-

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

等等等等……

-\w+一种递归模式 country也是如此provincescity

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

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

这虽然匹配,但正如您在 rubular screenshot attach 中看到的那样,它也呈现了不可接受的输出和 nil

我想要的只是避免在从给定的输入字符串中分离所需的字符串时导致匹配结果出现问题的non-acceptedand输出,或者有人可以建议我比这更好的正则表达式。nil

4

2 回答 2

0

(...)捕获组。Ruby(如果你正在使用的话)也支持 non-capture groups (?:...),所以我认为你想要:

(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 中。

于 2012-07-02T19:29:26.013 回答
0

如果你想匹配一组一个或多个字母和破折号,你可以用括号来表示一个字符集[\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']
于 2012-07-02T19:38:04.917 回答