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

标签 regex

我有以下内容:

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

最佳答案

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

复制粘贴(这样你就可以捕获破折号)并使用它:

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

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

请注意,字符类中的任何字符都不需要转义,甚至是连字符,因为它是第一个,并且在该位置不需要转义。

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


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

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

更具可读性。

关于正则表达式不匹配连字符后的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46852895/

相关文章:

用于提取java注释的python正则表达式

python - 解析 XML 模板标签的正则表达式

php - 只抓取 x 个字符 - 怎么做?

php - 为什么 < 和 > 需要在 preg_*() 模式中转义?

Java正则表达式转换

javascript - 除非信息填写正确,否则如何使提交按钮不可点击?

javascript - 多行正则表达式无法正常工作

python - Python 是否在 re 模块中使用 NFA 进行正则表达式评估?

Java Matcher.replaceAll() 也匹配 group(0) 元素

java - 将数组列表中的产品与另一个数组列表中的类似产品进行匹配