负前瞻不匹配后缀

时间:2020-05-28 19:23:59

标签: regex

我有一个匹配的表达式,但是试图使它不匹配,如果后面跟有后缀:一个或多个空格,三个破折号,一个或多个空格,一个或多个数字,斜杠和最后一个或多个数字。这是表达式:

(?<=(^|\s+))[A-Z]+[ ]+([0-9]+(\.[0-9]{1,3})?)/([0-9]+(\.[0-9]{1,3})?)(?!(\s+\-\-\-\s+[0-9]+/[0-9]+))

这是文本:

January        10.5/13.5   ---     22/26     --- 

它与1月10.5 / 13日匹配,但我不希望它与任何内容匹配。

1 个答案:

答案 0 :(得分:1)

由于支持环视,因此您可以将开始时的正向外观更改为向后负向外观,在左侧(?<!\S)声明空白边界

您可以使用.*来扫描整行,而不是从1个或更多的空白字符\s+

开始

否定前瞻(?!.*\s-{3}\s+[0-9]+/[0-9]断言右边不是后缀。

您可以在最后一个字符类之后省略量词+,因为紧随其后的是1个或多个数字并不重要,只要它不是数字即可。

请注意,在当前模式中,小数部分是一个可选的捕获组2。如果要在组1中获取整个值,可以将其设为optional group

(?<!\S)[A-Z]+[ ]+([0-9]+(\.[0-9]{1,3})?)/([0-9]+(\.[0-9]{1,3})?)(?!.*\s-{3}\s+[0-9]+/[0-9])

Regex demo