Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 编写QRegularExpression以仅返回最后一个匹配_Regex_Qt - Fatal编程技术网

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:.*)
表示我们只更改此修改器组中与
匹配的内容。下一个
(.*)
\.结束之前。太好了!!谢谢!