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

Regex not matching numbers after 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

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

复制粘贴(这样你就抓住了破折号)并使用这个:

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

在字符 class.

中同时包含常规连字符和破折号字符

请注意字符 class 中的 none 个字符需要转义,连字符也是如此,因为它位于第一个位置,因此不需要转义。

如果您也想添加 EM DASH,请复制 并将其粘贴到字符 class.

的末尾

如果您的 tool/language 支持 POSIX 字符 classes(可能),您可以使用 破折号 class Pd:

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

哪个更易读。