使用 OR 和 ^ 的无效提升正则表达式回顾

Invalid Boost Regex Lookbehind with OR and ^

我在使用 boost 正则表达式时遇到问题并怀疑它是一个错误,但我知道这里有人肯定知道并且是否有解决方法

我正在检查选择字符串的开头,白色-space 或使用

的下划线
(?<=^|\s|_)

但是在 boost 下这会产生一个错误:

错误:字符 0 处的正则表达式错误。在正则表达式中遇到无效的回顾断言。

没有 ^,一切都很好,同样只有 ^ 也很好。

我们将不胜感激解决此问题的任何帮助。

干杯

简介

您提供的代码 (?<=^|\s|_) 是使用 3 种可能性的回顾:

  1. ^ 在行首声明位置
  2. \s 匹配任意空白字符
  3. _字面匹配下划线字符

请注意,2.3. 匹配的字符数相同:一个,而 1. 将匹配零个字符(位置断言)。

因为 1. 的宽度为 0,而 2.3. 是宽度为 1,这会导致后视的宽度可变。一些正则表达式风格将允许诸如断言之类的微妙之处与固定宽度匹配一起使用,而其他风格则不允许。

通常,在回顾中,任何量词或其变体在匹配不共享相同长度(可变长度)时都会导致错误,如您所见。

解决方案

一些正则表达式风格允许您的代码 运行,而其他则不允许。对于不允许这种行为的正则表达式风格,应该使用变通方法。

对于您的具体情况,您可能可以使用以下正则表达式来解决您的问题

(?:^|(?<=\s|_))

Boost 正则表达式,如 Python re,不允许您在回顾中使用不同长度的替代项(^ 匹配零个字符,而 \s_ 都匹配 1 个字符)。见 Boost reference:

(?<=pattern) consumes zero characters, only if pattern could be matched against the characters preceding the current position (pattern must be of fixed length).

在这些情况下,最好使用 negative lookbehind 与 negated 字符 class 匹配任何char but 你需要的那些。 (?<=^|\s|_) 模式将变为

(?<![^\s_])

它将匹配除空格或 _ 之外没有紧跟字符的任何位置(即它将匹配字符串的开头 (^),在空格或 _,正是您所需要的)。

参见 regex demo: