编写QRegularExpression仅返回贪婪的最后一场比赛

时间:2017-06-05 10:19:01

标签: regex qt

我有一个如下所示的输入文件:

.SUBCKT (stuff including newline characters)
.ENDS (stuff)

.SUBCKT (stuff including newline characters)
.ENDS (stuff)

.SUBCKT (stuff including newline characters)
.ENDS (stuff)

.SUBCKT (stuff including newline characters)
.ENDS (stuff I don't want)

(What I want to get, includes a newline characters)

.END

所以我想要做的是写一个正则表达式(使用Qt,所以QRegularExpression),这将获得“我想要得到”的所有东西(在最后的.ENDS和.END之间没有得到“东西我不想要“。我不想要的东西是在最后一个.ENDS之后和它之后的第一个换行符。

我最成功的尝试是这个代码:

QStringList toplevel;
QRegularExpression regexp_toplevel("\\.ENDS(.*?)\n(.*?)\\.END",QRegularExpression::DotMatchesEverythingOption);
QRegularExpressionMatchIterator toplevel_i = regexp_toplevel.globalMatch(contents);
while (toplevel_i.hasNext()){
    QRegularExpressionMatch match = toplevel_i.next();
    toplevel << match.captured(2);
}

上面的代码返回一个字符串列表,最后一个是我想要的。但是由于迭代完成了java-stlye,我并不是100%肯定我想要的东西总是最后一个。有没有什么方法可以写表达式只获得第一个换行符和.END之后的最后一个.ENDS之间的内容。

1 个答案:

答案 0 :(得分:1)

您可以使用

(?ms).*^\.ENDS(?-s:.*)\n(.*)\.END

请参阅regex demo

<强>详情:

  • (?ms) - m会使^与第一行匹配,而s会使.匹配换行符
  • .* - 将尽可能多地(贪婪地)匹配任何0+字符,直到 last 出现...
  • ^\.ENDS - 一行开头的.ENDS子字符串
  • (?-s:.*) - 该行的其余部分(如果有任何字符仍在那里)
  • \n - 换行符(可替换为\\R以匹配任何样式换行符)
  • (.*) - 第1组:任意0个字符,尽可能多,直至最后一个(如果您需要匹配第一个.END,请添加?之后*
  • \.END - .END文字子字符串。

声明为

QRegularExpression regexp_toplevel("(?ms).*^\\.ENDS(?-s:.*)\n(.*)\\.END");

您需要的值将在match.captured(1)内。