正则表达式不匹配连字符后的数字
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↉½⅓⅔¼¾⅕⅖⅗⅘⅙⅚⅐⅛⅜⅝⅞⅑⅒⅟])+
您文本中的 "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↉½⅓⅔¼¾⅕⅖⅗⅘⅙⅚⅐⅛⅜⅝⅞⅑⅒⅟])+
哪个更易读。
我有以下内容:
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↉½⅓⅔¼¾⅕⅖⅗⅘⅙⅚⅐⅛⅜⅝⅞⅑⅒⅟])+
您文本中的 "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↉½⅓⅔¼¾⅕⅖⅗⅘⅙⅚⅐⅛⅜⅝⅞⅑⅒⅟])+
哪个更易读。