LLVM 3.4版本Regex::BasicRegex使用+元字符失效是否为Bug?
这不是Bug,是POSIX正则模式的语法差异导致的
这其实不是LLVM的Bug,而是你对Regex::BasicRegex选项对应的正则模式理解有偏差导致的。
核心原因:LLVM BasicRegex对应POSIX BRE而非ERE
LLVM 3.4中,Regex::BasicRegex选项启用的是**POSIX基本正则表达式(BRE)**模式,而非你预期的扩展正则表达式(ERE)。这两种模式在量词的语法上有关键区别:
- 在BRE里,
*是原生的量词(表示匹配前面的元素0次或多次),所以你的第一个表达式[A-Za-z0-9]*ClassDecl能正常匹配目标字符串。 - 但
+在BRE中只是普通字符,不具备“匹配1次或多次”的量词含义。此时引擎会把[A-Za-z0-9]+ClassDecl理解为:匹配[A-Za-z0-9]字符后紧跟一个+符号,再加上ClassDecl——这显然和你的预期不符,所以才会看起来“无法工作”。
两种解决办法
你可以根据需求选择以下任意一种方式修复:
- 方法一:在BRE模式下转义
+
既然用了BasicRegex(BRE模式),要让+发挥量词作用,需要对它进行转义(注意C++字符串里要双反斜杠):new Regex("[A-Za-z0-9]\\+ClassDecl", llvm::Regex::BasicRegex) - 方法二:切换到默认的ERE模式
LLVM的Regex默认使用POSIX扩展正则表达式(ERE),这种模式下+是原生量词,不需要转义。直接去掉BasicRegex选项即可:new Regex("[A-Za-z0-9]+ClassDecl")
内容的提问来源于stack exchange,提问作者toomanychushki
相关产品推荐
相关产品推荐

