2017-10-20 147 views
1

后不匹配的号码我有以下几点:正则表达式连字符

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

回答

2

符号“ - ”在你的文字实际上是一个EN DASH(十六进制2013或十进制8211),而不是常规连字符(十六进制2D或十进制45)。

复制粘贴(所以你抢短破折号),并使用此:

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

同时具有普通连字符和字符类的短横线字符。

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

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


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

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

这是更具可读性。

+1

所以我认为有一个破折号(Dash标点符号)的Unicode字符类,如果C++是一个选项:http://www.boost.org/doc/libs/1_58_0/libs/regex/doc/html/boost_regex /syntax/character_classes/optional_char_class_names.html – BurnsBA

+0

Whaaaat ..无语!这将花费我一百万年,甚至开始怀疑格伦,你的答案是我的泰诺。 – Craig

+2

@BurnsBA是,它是'\ p {Pd}'。我用这个替代方案更新了答案。感谢提醒我它存在。 – Bohemian