【问题标题】:Regex not matching numbers after hyphen连字符后的正则表达式不匹配数字
【发布时间】:2017-10-20 15:57:58
【问题描述】:

我有以下几点:

1.5 5 tablespoon cream
½ (1 cup) heavy cream
¼ – ½ teaspoon cream
1 tablespoon cream

^(?:[\-\.\/\s]*[\d↉½⅓⅔¼¾⅕⅖⅗⅘⅙⅚⅐⅛⅜⅝⅞⅑⅒⅟])+

我试图弄清楚为什么 ¼ – ½ 不匹配,我在非捕获组中有一个转义的连字符。

我的尝试:

^(?:[\-\.\/\s\W]*[\d↉½⅓⅔¼¾⅕⅖⅗⅘⅙⅚⅐⅛⅜⅝⅞⅑⅒⅟])+ 但它与½ (1 匹配,我只想要包含点、连字符和空格的所有内容。

带有标记非单词字符的\W 的负前瞻,它准确地捕获了我想要实现的目标,但是负前瞻并没有阻止1 (1 被捕获,这是我尝试过的: ^(?:[\-\.\/\s\W]*(?!\()*[\d↉½⅓⅔¼¾⅕⅖⅗⅘⅙⅚⅐⅛⅜⅝⅞⅑⅒⅟])+

https://regex101.com/r/bITQ4F/2

【问题讨论】:

    标签: regex hyphen


    【解决方案1】:

    文本中的“连字符”实际上是 EN DASH(十六进制 2013 或十进制 8211),而不是常规连字符(十六进制 2D 或十进制 45)。

    复制粘贴(所以你抓住破折号)并使用它:

    ^(?:[-–./\s]*[\d↉½⅓⅔¼¾⅕⅖⅗⅘⅙⅚⅐⅛⅜⅝⅞⅑⅒⅟])+
    

    在字符类中同时具有常规连字符和短划线字符。

    请注意,字符类中的所有字符都不需要转义,即使连字符也不需要转义,因为它是第一个并且在该位置不需要转义。

    如果您也想添加EM DASH,请将 复制并粘贴到字符类的末尾。


    如果您的工具/语言支持 POSIX 字符类(可能),您可以使用 破折号Pd:

    ^(?:[\p{Pd}./\s]*[\d↉½⅓⅔¼¾⅕⅖⅗⅘⅙⅚⅐⅛⅜⅝⅞⅑⅒⅟])+
    

    这更易读。

    【讨论】:

    • 所以我认为有一个 unicode 字符类用于破折号(破折号标点符号),如果 c++ 是一个选项:boost.org/doc/libs/1_58_0/libs/regex/doc/html/boost_regex/…
    • 哇……无语!我花了一百万年才开始怀疑格伦,你的答案是我的泰诺。
    • @BurnsBA 是的,它是\p{Pd}。我已经用那个替代方法更新了答案。谢谢你提醒我它的存在。
    • 点后的 / 需要通过@Bohemian 进行转义
    • @Johnson 取决于您的语言。某些语言(如 JS)delimit 正则表达式使用斜线,在这种情况下,您需要转义斜线,但一般不需要 - 斜线在正则表达式中没有特殊含义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多