使用OR和^无效的Boost Regex Lookbehind

时间:2017-10-02 16:28:25

标签: regex boost-regex

我遇到了强制正则表达式的问题,并怀疑它是一个错误,但是知道这里有人肯定知道并且是否有解决方法

我正在使用

检查字符串,空格或下划线开始的选择
(?<=^|\s|_)

然而,在提升下,这会产生错误:

错误:char 0处的正则表达式错误。正则表达式中遇到无效的lookbehind断言。

如果没有^,一切都很好,同样只有^罚款。

任何帮助解决这个问题都会受到极大的欢迎。

干杯

2 个答案:

答案 0 :(得分:2)

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

  1. ^在行首处断言位置
  2. \s匹配任何空格字符
  3. _字面上匹配下划线字符
  4. 请注意,如上所述, 2。 3。的匹配字符数相同:一, 1。将匹配零个字符(位置断言)。

    由于 1。的宽度为0,而 2。 3。的宽度为1,因此导致后置为可变宽度。一些正则表达式的口味将允许断言,如断言与固定宽度匹配一起使用,而其他人则不会。

    通常情况下,在外观中,匹配的任何量词或变体不共享相同的长度(可变长度)会导致错误,如您所见。

    解决方案

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

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

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

答案 1 :(得分:2)

Boost正则表达式与Python re一样,不允许您在lookbehind中使用不同长度的替代品(^匹配零个字符,而\s_匹配1个字符两个)。请参阅Boost reference

  

(?<=pattern)消耗零个字符,仅当模式可以与当前位置之前的字符匹配时(模式必须是固定长度)。

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

(?<![^\s_])

它将匹配任何不会立即加上除空白或_以外的字符的位置(即它将匹配字符串的开头(^),在空格或{{1}之后,正是你需要的。)

请参阅regex demo

enter image description here