我有一个如下所示的输入文件:
.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之间的内容。
答案 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)
内。