连字符后正则表达式不匹配数字

时间:2017-10-20 15:57:58

标签: regex hyphen

我有以下内容:

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

1 个答案:

答案 0 :(得分:2)

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

复制粘贴(所以你抓住短划线)并使用它:

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

在字符类中同时包含常规连字符和短划线字符。

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

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

如果您的工具/语言支持POSIX字符类(可能),您可以使用 dash标点Pd

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

更具可读性。