我正在尝试构建一个正则表达式,我被要求过滤字符串
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
由于-
您可以假设国家/地区,省或城市都有许多-
像
country:United-States-of-America provinces:Washington-Dc city:New-York-West
等 等...
所以-\w+
是一种递归模式,country
,provinces
,city
或所有这些模式中出现0或更多
现在我也尝试为这样的东西构建一个正则表达式
(country:\w+(-\w+)*)|(province:\w+(-\w+)*)|(city:\w+(-\w+)*)|(zip_code:\w+(-\w+)*)
这虽然匹配 但正如你在rubular screenshot中所看到的那样,它还提供了不接受的输出和nil
我想要的是避免non-accepted
和nil
输出,当从给定的输入字符串中分离所需的字符串时,会导致匹配结果出现问题,或者有人建议我使用比此更好的正则表达式
答案 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']