【问题标题】:Recursive sort of regular expression递归排序的正则表达式
【发布时间】:2020-01-26 16:10:56
【问题描述】:

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

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+ 是一种递归模式,在countryprovincescity 或所有这些中出现0 次或多次

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

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

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

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

【问题讨论】:

  • 正则表达式不能以直接帮助您的方式工作。如果您正在使用支持正则表达式的编程语言,那么有一些非常简单的解决方案可以解决您想要做的事情。但是,您使用什么语言工作?红宝石?如果您告诉我们,我们可以提供更准确的解决方案。
  • @AndrewMartinez Yes Ruby

标签: regex regular-language


【解决方案1】:

如果你想匹配一组一个或多个字母和破折号,你可以只用括号来表示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']

【讨论】:

    【解决方案2】:

    (...) 是捕获组。 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 中。

    【讨论】:

      猜你喜欢
      • 2012-01-16
      • 2012-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-10
      • 2023-03-12
      • 2015-05-30
      • 1970-01-01
      相关资源
      最近更新 更多