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"。我的输入的扩展版本现在在上面编辑。
(\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/
相关文章:
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 为什么static_assert错误:即使我传递常量"expression must have a constant value"?
- C++ "error: invalid use of void expression"
- "Warning: Comma within array index expression"但逗号分隔函数参数
- 对象声明中的模板"error: expected expression"
- 为什么我的功能在使用 goto 时会给我带来"expected primary-expression before '}' token"?
- 为什么我会"error: expected expression"?
- 叮当声:折叠表情和"expression result unused"警告
- 错误消息"expected expression"....有人知道它为什么这么说吗?
- C++ 向量加减抛出"expression: vector subscript out of range."错误
- "expression must be a modifiable lvalue"是什么意思?
- 如何理解"Temporary objs are destroyed as the last step in evaluating the full-expression"?谁能用一些简单的例子来说明这
- "noexcept-expression 由于对......的调用而计算为'假'"是什么意思?
- unordered_set .find 方法无法编译的 C++ "expression must have class type"错误
- 如何修复此错误"expected primary expression before 'int'"?
- 使用结构和数组时的"expected primary expression before '.' token"
- 如何修复 eigen3 中的'non-type template argument is not a constant expression'?
- 编译为 cuda 内核调用提供了"expression must have integral or unscoped enum type"
- 如何解决"Expected expression before " = " token"?
- QRegular expression