如何用QRegularExpression匹配嵌套的单行#注释?
解决QRegularExpression匹配多行#注释的问题
你的问题出在正则表达式的匹配范围上:当前用的 #[^\n]* 会从第一个 # 开始,匹配所有直到行尾的非换行字符——这就导致第二个 # 被包含在第一个匹配结果里,所以globalMatch不会再把它当作新的匹配项。
根据你的需求(提取所有以#开头的单行注释片段),这里有两种常见场景的解决方案:
场景1:提取每个独立的#开头片段
如果你想把一行中每个#开头的部分都单独提取出来(比如把 # A test with some 和 #comments 分开匹配),可以修改正则表达式为 #[^#\n]*。这个表达式的逻辑是:
#:匹配注释起始标记[^#\n]*:匹配任意数量的非#且非换行符的字符,这样每遇到一个新的#就会终止当前匹配,触发下一次匹配。
修改后的代码如下:
const QString text { "Here # A test with some #comments" }; const QRegularExpression pattern { "#[^#\\n]*" }; // 注意C++中反斜杠需要转义 QRegularExpressionMatchIterator it = pattern.globalMatch(text); while (it.hasNext()) { const QRegularExpressionMatch match = it.next(); qDebug() << match.capturedTexts()[0]; }
运行后会输出两个匹配结果:
"# A test with some " "#comments"
场景2:提取从每个#到行尾的完整内容(少见场景)
如果你的需求是把每个#到行尾的内容都作为独立匹配(比如即使前面已经有#,后面的#也单独触发到行尾的匹配),可以使用正向预查来避免匹配重叠,正则表达式改为 #.*?(?=#|$)。不过这种场景在实际注释处理中很少见,因为通常单行注释从第一个#开始就属于注释内容了。
另外要注意:在C的字符串字面量中,正则里的转义字符(比如\n、\$)需要额外加一个反斜杠进行转义,否则会被C编译器当作字符串转义符处理。
内容的提问来源于stack exchange,提问作者Maluna34
相关产品推荐
相关产品推荐

