我有以下内容:
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↉½⅓⅔¼¾⅕⅖⅗⅘⅙⅚⅐⅛⅜⅝⅞⅑⅒⅟])+
最佳答案
文本中的“连字符”实际上是 EN DASH (十六进制 2013 或十进制 8211),而不是常规连字符(十六进制 2D 或十进制 45)。
复制粘贴(这样你就可以捕获破折号)并使用它:
^(?:[-–./\s]*[\d↉½⅓⅔¼¾⅕⅖⅗⅘⅙⅚⅐⅛⅜⅝⅞⅑⅒⅟])+
在字符类中同时具有常规连字符和短划线字符。
请注意,字符类中的任何字符都不需要转义,甚至是连字符,因为它是第一个,并且在该位置不需要转义。
如果您想添加 EM DASH同样,复制 —
并将其粘贴到字符类的末尾。
如果您的工具/语言支持 POSIX 字符类(可能),您可以使用破折号标点类Pd
:
^(?:[\p{Pd}./\s]*[\d↉½⅓⅔¼¾⅕⅖⅗⅘⅙⅚⅐⅛⅜⅝⅞⅑⅒⅟])+
更具可读性。
关于正则表达式不匹配连字符后的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46852895/