【问题标题】:Rails Regex Match Group Overwriting itselfRails 正则表达式匹配组覆盖自身
【发布时间】:2017-02-21 20:16:18
【问题描述】:

我正在尝试匹配这个字符串:

NFPA 101 19.7.2.2

并且正在使用这个正则表达式:

(NFPA) (\w+)(?: ?(?:([^.]+)\.?)+)?

这似乎与字符串匹配,但捕获的组不是我要查找的。我期望:

  1. NFPA
  2. 101
  3. 19
  4. 7
  5. 2
  6. 2

我得到的是这样的:

  1. NFPA
  2. 101
  3. 2

请参阅这个 rubular 示例: http://rubular.com/r/43VY0yyNa7

就好像最后一个重复捕获组被最终匹配覆盖。有没有办法让所有这些作为我需要的捕获组返回?

添加了另一个正则表达式,它给了我上面描述的类似问题: (NFPA) (.+) (.+?.)+(.+)

【问题讨论】:

    标签: ruby-on-rails regex rubular


    【解决方案1】:

    问题是您使用 non-capturing group 符号 : 无法将字符串选择为单独的捕获组。要克服这个问题,您需要使用Positive / Negative Lookahead。因此,以下 regex 在这种情况下应该可以工作:

    (\w+|\d+[-]\d+)(?=\s?)(?![-])
    

    demo

    【讨论】:

    • 这适用于该字符串,但我有多种其他原因可以按照我的方式进行操作。我的主要问题是匹配组似乎覆盖了自己。例如,您的解决方案将在以下字符串上失败:NFPA 101 7-9.3 Where 7-9 should be match.
    • @steventnorris 在这种情况下,您应该在问题中提到所有可能的字符串组合
    • 我明白了。我的问题主要是为什么我当前正则表达式中的匹配组没有给我预期的数组,而不是如何具体匹配该字符串。
    • 正/负前瞻是缺失的部分。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    • 2019-01-13
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多