QRegular expression

QRegular expression

本文关键字:expression QRegular      更新时间:2023-10-16

在使用正则表达式和 Qt 打开大括号(即 p)之前,我找不到匹配文本的方法。我的输入文件显示:

  solvers 
  { 
      p
      { 
          solver          PCG; 
          preconditioner  DIC; 
          tolerance       1e-06; 
          relTol          0.05; 
      }
      q
      {
          solver          PCG;
          relTol          0.03;
      }
   }

.cpp对应的代码是:

rule.pattern = QRegularExpression("\b(\w+)(?=[\s+n]?\{)",
                                  QRegularExpression::MultilineOption);

有没有对Qt和正则表达式有更好了解的人可以向我解释实现这一目标的方法?


编辑 #1

感谢您的回复和评论。两件事:

  • 我打错了输入文件没有">"符号,所以我在上面完成的输入中对其进行了编辑。
  • 我试图匹配p块的"
  • p"和q块的"q"。我的输入的扩展版本现在在上面编辑。
我发现 \}\s*

(\w+)(?=\s*\{) 与"q"q 块匹配,但在代码中不起作用。它似乎在"p"和括号"{"之间的返回中挣扎。


编辑#2:显示代码

在荧光笔中.cpp

  #include "highlighter.h"
Highlighter::Highlighter(QTextDocument *parent)
    : QSyntaxHighlighter(parent)
{
    HighlightingRule rule;
    (...)
    varFormat.setFontWeight(QFont::Bold);
    varFormat.setForeground(Qt::darkMagenta);
    rule.pattern = QRegularExpression("^\s+(\w+)\s*$",QRegularExpression::MultilineOption);
    rule.format = varFormat;
    highlightingRules.append(rule);
 (...) }  

void Highlighter::highlightBlock(const QString &text)
{
    foreach (const HighlightingRule &rule, highlightingRules) {
        QRegularExpressionMatchIterator matchIterator = rule.pattern.globalMatch(text);
        while (matchIterator.hasNext()) {
            QRegularExpressionMatch match = matchIterator.next();
            setFormat(match.capturedStart(), match.capturedLength(), rule.format);
        }
    }
    setCurrentBlockState(0);
    int startIndex = 0;
    if (previousBlockState() != 1)
        startIndex = text.indexOf(commentStartExpression);
    while (startIndex >= 0) {
        QRegularExpressionMatch match = commentEndExpression.match(text, startIndex);
        int endIndex = match.capturedStart();
        int commentLength = 0;
        if (endIndex == -1) {
            setCurrentBlockState(1);
            commentLength = text.length() - startIndex;
        } else {
            commentLength = endIndex - startIndex
                            + match.capturedLength();
        }
        setFormat(startIndex, commentLength, multiLineCommentFormat);
        startIndex = text.indexOf(commentStartExpression, startIndex + commentLength);
    }
}

看看[\s+n]?,它匹配任何空格或+字符的 1 或 0 次出现。但是solvers{之间有超过 1 个空格。

(?=[\s+n]?\{)替换为(?=\s*{)已经可以解决此问题。但您也可以使用

QRegularExpression("^\s*(\w+)\s*\{", QRegularExpression::MultilineOption)

以匹配

  • ^ - 行的开头
  • \s* - 0+ 空格
  • (\w+) - 第 1 组(您可以通过 match.captured(1) 获得):一个或多个单词字符
  • \s* - 0+ 空格后跟
  • { - 字面上的{.

请参阅正则表达式演示。

因为 p 不在 { 之后,而是在 } 之后

你可以这样走: [{}]s*(w+)(?=s*{)看到 https://regex101.com/r/wA1vu2/3

或者这个: (?P<tagname>[^{}s]*)(?P<postspace>s*)(?P<json_item>{[^{}]*})

  • ?P<tagname>匹配项的名称
  • ?P<json_item>{[^{}]*} - 叶级项目
  • (?P<postspace>s*) - 叶项和叶名称之间的空格
  • (?P<tagname>[^{}s]*) - 叶名

https://regex101.com/r/wA1vu2/1/

相关文章: