Regex 编写QRegularExpression以仅返回最后一个匹配
我有一个如下所示的输入文件:Regex 编写QRegularExpression以仅返回最后一个匹配,regex,qt,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 (stu
.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-So-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);
}
QStringList顶级;
QRegularExpression regexp\u顶层(\\.END(.*?)\n(.*?\.END),QRegularExpression::DotMatchesEverythingOption);
QRegularExpressionMatchIterator toplevel\u i=regexp\u toplevel.globalMatch(目录);
while(toplevel_i.hasNext()){
QRegularExpressionMatch=toplevel_i.next();
toplevel您可以使用
(?ms).*^\.ENDS(?-s:.*)\n(.*)\.END
见
详细信息:
(?ms)
-m
将使^
匹配行开始,而s
将使
匹配换行符
*
-将匹配任何0+字符,尽可能多(贪婪地),直到最后一次出现
^\.ENDS
-一个.ENDS
子字符串位于行的开头
(?-s:.*)
-行的其余部分(如果还有字符)
\n
-换行符(可替换为\\R
以匹配任何样式的换行符)
(.*)
-第1组:尽可能多的0+字符,直到最后一个(如果需要匹配到第一个。结束,在*
之后添加?
)
\.END
-.END
文字子字符串
宣布为
QRegularExpression regexp_toplevel("(?ms).*^\\.ENDS(?-s:.*)\n(.*)\\.END");
您需要的值将在匹配中。捕获(1)
太好了!!!我正在学习RegExp,您介意解释一下这个表达式是如何组合在一起的吗。从一开始我就看到了3个捕获组,为什么我想要的是第一个?哦,非常感谢您没有,只有1个捕获组。(?ms)
是一个为整个模式设置正则表达式选项的内联修饰符组。(?-s:.*)
是一个修饰符组,其中为整个模式设置的s
(DOTALL)修饰符组被关闭,
只匹配任何字符,但不匹配换行字符(这就是为什么我将其描述为“行的其余部分”)。很好的解释!!模式中还有一件事(?s:*)如果我理解正确,那么该匹配中的下一个组将不匹配换行符,因此(?)用于表示您正在修改最后一个组修饰符,-s正在删除s(DOTALL),并且:之后的所有内容都是实际的regexp。对吗?(请参阅)“将非捕获组与内联修饰符组合起来”)只是以更方便的方式控制模式部分的一种“特效”。(?-s:
是启用(如果将修饰符放在?
之后)或禁用(当放在-
之后)regex选项的部分。(?-s:.*)
表示我们只更改此修改器组中与
匹配的内容。下一个(.*)
在\.结束之前。太好了!!谢谢!