【问题标题】:qt regular expression look behindqt正则表达式看后面
【发布时间】:2018-05-02 00:42:12
【问题描述】:

我的正则表达式:(?<=defining\s)[^;]*

在以下情况下应尝试查找var

   defining var;
some text defining var;

我使用一些在线工具测试了正则表达式。不幸的是,由于某种原因,它不适用于 Qt。正则表达式有问题还是我应该在代码的其他地方查找错误?这很奇怪,因为没有后视的正则表达式可以工作。

额外: 有点跑题了,但是因为我已经在写问题了:如何更改我的正则表达式,以便它可以在以下情况下找到具有多个空格的 var:

some text defining      var;

现在它只找到一个空格和 var。

【问题讨论】:

  • 根据this qt documentation pagePerl's lookbehind assertions, "independent" subexpressions and conditional expressions are not supported.
  • 哦,那很糟糕。有没有办法在没有后向断言的情况下重写我的正则表达式?
  • 你可以捕获两个部分:(defining\s+)([^;]*)。将\s 更改为\s+ 还允许它匹配多个空白字符。然而,使用后向断言是不可能的,因为它们必须是固定的宽度。你会得到匹配中的空白而不是后视。
  • 好的,我想这就是我最终要做的。
  • 您使用的是哪个版本的 Qt,因为 QRegularExpression 应该根据this blog article by the class' author 支持lookbehinds。这并没有改变您仍然无法使用可变宽度后视的事实,但出于好奇。

标签: regex qt qregularexpression


【解决方案1】:

你可以匹配你想要获取的值左边的上下文,并将后者捕获到一个捕获组中:

QRegularExpression regex("defining\\s+([^;]+)");
QRegularExpressionMatch match = regex.match(str);
QString textYouWant = match.captured(1);

这里,defining\\s+([^;]+) 匹配 defining,然后是 1+ 个空白字符,然后将除 ; 之外的 1+ 个字符捕获到组 1(您可以使用 .captured(1) 访问)。

this regex demo

请注意,QRegularExpression 是 PCRE 驱动的,因此您可以使用 PCRE \K 运算符在匹配本身中获取您需要的值:

QRegularExpression regex("defining\\s+\\K[^;]+");
                                      ^^^

\K 操作符会丢弃目前匹配的文本,所以你只会在匹配返回后得到与[^;]+ 匹配的文本。

another regex demo

【讨论】:

    猜你喜欢
    • 2018-01-30
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 2016-05-10
    相关资源
    最近更新 更多