我正在尝试编写一个查找所有 ';' 的正则表达式 后面没有新行 (\n) 字符的字符。
;(?!\\\n)
以及前面没有“;”的所有新行 (\n) 字符 特点:
(?< !;)\\\n
不幸的是,我使用的是 Qt 4.7.4 QRegExp,它不支持“往后看”。如何重写上面的正则表达式,使其不使用“向后看”?
从文档中引用:
http://doc.qt.digia.com/4.7/qregexp.html#details
使用与 Perl 相同的语法支持零宽度正和零宽度负前瞻断言 (?=pattern) 和 (?!pattern)。
可能发生的情况是您在 Windows 机器上运行,该机器已插入\r\n
而不只是\n
... 或者它可能是在 Windows 机器上创建的文本文件。
需要注意的一件事是,我发现对于后视,您不能使用大多数正则表达式处理程序进行可变长度的后视。
如果lookbehinds/lookaheads 仍然给您带来麻烦,另一个要查看的选项是使用捕获组,然后仅引用您感兴趣的捕获组。
从文档的代码示例部分,它有这个:
str = "Nokia Corporation\tqt.nokia.com\tNorway";
QString company, web, country;
rx.setPattern("^([^\t]+)\t([^\t]+)\t([^\t]+)$");
if (rx.indexIn(str) != -1) {
company = rx.cap(1);
web = rx.cap(2);
country = rx.cap(3);
}
捕获组用括号定义,稍后通过从 1 开始的索引访问。第零个索引是整个匹配项(不分成捕获组)。
http://doc.qt.digia.com/4.7/qregexp.html#cap
http://doc.qt.digia.com/4.7/qregexp.html#capturedTexts
希望有帮助。正则表达式在正常工作时会很有趣。祝你好运。
我也喜欢使用这个工具。格式可能与 QRegEx 略有不同,但一旦你拥有它,它的翻译和测试速度非常快。
更新:这是一个完整的套件,展示了 4 个不同的捕获字符串以及它们在 QRegEx 中发现的内容:
#include <QCoreApplication>
#include <QRegExp>
#include <QString>
#include <QDebug>
#include <QStringList>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString str =
"This is a long string;\n"
"with some semi colons;\n"
"sometimes followed by a new line;\n"
"and other times followed; by something else.\n"
"(;)([^\\n]) find a semicolon and a new line\n"
"(;)(?!\\n) find a semicolon not followed by a new line, negative look-ahead\n"
"([^;])(\\n) find a non semicolon and a new line\n"
"(?<!;)(\\n) find a new line, not preceeded by a semicolon.\n";
QList <QRegExp> rx_list;
QRegExp rx_colon_and_non_newline;
rx_colon_and_non_newline.setPattern("(;)([^\\n])");
QRegExp rx_colon_and_neg_lookahead;
rx_colon_and_neg_lookahead.setPattern("(;)(?!\\n)");
QRegExp rx_non_colon_and_newline;
rx_non_colon_and_newline.setPattern("([^;])(\\n)");
QRegExp rx_neg_lookbehind_and_newline;
rx_neg_lookbehind_and_newline.setPattern("(?<!;)(\\n)");
rx_list << rx_colon_and_non_newline
<< rx_colon_and_neg_lookahead
<< rx_non_colon_and_newline
<< rx_neg_lookbehind_and_newline;
foreach(QRegExp rx, rx_list)
{
int count = 0;
int pos = 0;
qDebug() << "Pattern" << rx.pattern();
while ((pos = rx.indexIn(str, pos)) != -1) {
QStringList capturedTexts(rx.capturedTexts());
for(int i = 0; i<capturedTexts.size(); i++)
capturedTexts[i].replace('\n',"\\n");
qDebug() << "\t" << count << "Found at position" << pos << capturedTexts;
// qDebug() << rx.cap();
pos += rx.matchedLength();
++count;
}
if(count == 0)
qDebug() << "\tNo matches found.";
}
return a.exec();
}
输出:
Pattern "(;)([^\n])"
0 Found at position 104 ("; ", ";", " ")
1 Found at position 126 (";)", ";", ")")
2 Found at position 169 (";)", ";", ")")
3 Found at position 247 (";]", ";", "]")
4 Found at position 295 (";)", ";", ")")
Pattern "(;)(?!\n)"
0 Found at position 104 (";", ";")
1 Found at position 126 (";", ";")
2 Found at position 169 (";", ";")
3 Found at position 247 (";", ";")
4 Found at position 295 (";", ";")
Pattern "([^;])(\n)"
0 Found at position 123 (".\n", ".", "\n")
1 Found at position 166 ("e\n", "e", "\n")
2 Found at position 242 ("d\n", "d", "\n")
3 Found at position 289 ("e\n", "e", "\n")
4 Found at position 347 (".\n", ".", "\n")
Pattern "(?<!;)(\n)"
No matches found.
不支持 Perl 的后向断言、“独立”子表达式和条件表达式。
来自http://doc.qt.io/archives/qt-4.8/qregexp.html
所以(?<;!;)\n
不起作用
并且(?!;)\n
将匹配所有换行符
,无论它们前面是否有;