【问题标题】:Why does this pattern not match after the “-”?为什么这个模式在“-”之后不匹配?
【发布时间】:2020-09-18 05:24:05
【问题描述】:

我有以下模式,它应该适用于 C++ 正则表达式、perl 和 grep。有谁知道为什么 0000 的字符串在减号 - 之后不匹配?

$ echo AB 00000-0000 | grep -Po "(\w{2}\s*\d{5}(−\d{4})?)"
AB 00000
$ echo AB00000-0000 | grep -Po "(\w{2}\s*\d{5}(−\d{4})?)"
AB00000

【问题讨论】:

    标签: regex perl grep


    【解决方案1】:

    你的减号不是你想象的那样。当我将您的代码复制并粘贴到我的 shell 中时,我看到:

    echo AB00000-0000 | grep -Po "(\w{2}\s*\d{5}(\342\210\222\d{4})?)"
    

    当我使用普通的旧减号(而不是 \342\210\222,这就是我得到的:

    $ echo AB00000-0000 | grep -Po "(\w{2}\s*\d{5}-\d{4}?)"
    AB00000-0000
    

    【讨论】:

    • @notaorb - 正如您所了解的(也许已经知道),有几个破折号字符。如果您的输入中确实有一个 n-dash(中等宽度),那么解决方案不是用原始字符串中的连字符替换它,而是在正则表达式中使用 n-dash,所以它将按原样匹配输入字符串。 chicagomanualofstyle.org/qanda/data/faq/topics/…
    【解决方案2】:

    看起来您在正则表达式中使用的破折号文字与输入中的破折号不同。输入破折号是一个小 -,而您的正则表达式中的破折号稍长。不确定您的输入设备有何不同,但是当我将您的破折号换成短破折号时:-您的表达效果很好。

    (\w{2}\s*\d{5}(-\d{4})?)

    这是一个可以帮助你的好工具,我经常使用它: https://regex101.com/

    【讨论】:

      猜你喜欢
      • 2012-09-17
      • 1970-01-01
      • 1970-01-01
      • 2016-08-15
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 2020-08-20
      • 1970-01-01
      相关资源
      最近更新 更多