非贪婪条件忽略使用QRegExp的行中的注释

时间:2016-08-04 13:41:02

标签: c++ regex parsing qregexp

我想知道/有一个qregexp可以从一行中提取所有整数,但如果数字位于评论部分则停止提取

For Example

    { 20,100,0X0},/*this line contains 2 integers*/

我的代码

QRegExp("(\\d+)\\}"); 

完成工作,但效率不高,因为评论可以在花括号内

For Example, my Expression WILL NOT WORK IF
{ 20,100/*new comment 2*/,0X0}

那么如何使用QRegExp忽略评论部分中的字符串并继续搜索我的表达

2 个答案:

答案 0 :(得分:0)

我建议将所有多行注释作为正则表达式中的第一个替代,并匹配和捕获数字序列(即使用围绕[0-9]+模式的捕获组):

QRegExp("/\\*[^*]*\\*+(?:[^/*][^*]*\\*+)*/|\\b([0-9]+)\\b")

现在,您需要的数字位于cap(1)

请参阅regex demo

看起来你需要在[0-9]+模式周围使用单词边界来匹配独立,"整个单词"数字块。

模式详情

答案 1 :(得分:0)

除非正则表达式引擎支持负向lookbehind的完整正则表达式(根据http://www.regular-expressions.info/ - 只有.NET和JGsoft引擎这样做),否则你需要单独找到注释部分才能可靠地执行此操作。

第一遍删除或跳过字符串中的评论部分,然后根据需要进行数字匹配(例如现在)。

要查找评论,您可以使用以下模式:

/\*((?!\*/).)*\*/

如果您需要处理嵌套的评论部分,如果需要,您需要删除评论并重复,直到找不到评论部分。

另一方面,如果不需要嵌套注释,则可以将注释和数字匹配正则表达式合并为一个,然后检查匹配的字符串(或捕获)以查明它是注释还是数字匹配。