我遇到了强制正则表达式的问题,并怀疑它是一个错误,但是知道这里有人肯定知道并且是否有解决方法
我正在使用
检查字符串,空格或下划线开始的选择(?<=^|\s|_)
然而,在提升下,这会产生错误:
错误:char 0处的正则表达式错误。正则表达式中遇到无效的lookbehind断言。
如果没有^
,一切都很好,同样只有^
罚款。
任何帮助解决这个问题都会受到极大的欢迎。
干杯
答案 0 :(得分:2)
您提供的代码(?<=^|\s|_)
是使用3种可能性的后视:
^
在行首处断言位置\s
匹配任何空格字符_
字面上匹配下划线字符请注意,如上所述, 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: