QRegExp未按预期提取文本
我试图从一行文本的方括号中提取文本。我和正则表达式混在一起已经有一段时间了,我不能得到我需要的东西。(我甚至无法解释为什么输出是这样)。代码如下:QRegExp未按预期提取文本,regex,qt,qregexp,Regex,Qt,Qregexp,我试图从一行文本的方括号中提取文本。我和正则表达式混在一起已经有一段时间了,我不能得到我需要的东西。(我甚至无法解释为什么输出是这样)。代码如下: QRegExp rx_timestamp("\[(.*?)\]"); int pos = rx_timestamp.indexIn(line); if (pos > -1) { qDebug() << "Captured texts: " << rx_timestamp.capturedTexts();
QRegExp rx_timestamp("\[(.*?)\]");
int pos = rx_timestamp.indexIn(line);
if (pos > -1) {
qDebug() << "Captured texts: " << rx_timestamp.capturedTexts();
qDebug() << "timestamp cap: " <<rx_timestamp.cap(0);
qDebug() << "timestamp cap: " <<rx_timestamp.cap(1);
qDebug() << "timestamp cap: " <<rx_timestamp.cap(2);
} else qDebug() << "No indexin";
你错过了两件事。转义反斜杠,并使用
setMinimal
。见下文
QString line = "messages:[2013-10-08 09:13:41] NOTICE[2366] chan_sip.c: Registration from '\"xx000 <sip:xx000@183.229.164.42:5060>' failed for '192.187.100.170' - No matching peer found";
QRegExp rx_timestamp("\\[(.*)\\]");
rx_timestamp.setMinimal(true);
int pos = rx_timestamp.indexIn(line);
if (pos > -1) {
qDebug() << "Captured texts: " << rx_timestamp.capturedTexts();
qDebug() << "timestamp cap: " <<rx_timestamp.cap(0);
qDebug() << "timestamp cap: " <<rx_timestamp.cap(1);
qDebug() << "timestamp cap: " <<rx_timestamp.cap(2);
} else qDebug() << "No indexin";
更新:发生了什么:
C++源代码中的反斜杠表示下一个字符是转义字符,如<代码> \n。要在正则表达式中显示反斜杠,您必须像这样转义反斜杠:
\\
,这将使正则表达式引擎看到\
,就像Ruby、Perl或Python使用的那样
方括号也应该转义,因为它们通常用于表示正则表达式中的元素范围
因此,要让正则表达式引擎看到方括号字符,需要发送它
\[
< >但是C++源文件不能将<代码> \/COD>字符放入一个没有两行的字符串中,因此它变成了
\\[
在学习正则表达式时,我喜欢使用这个。页面右侧有一个独特代码和字符列表
QRegEx
与regex不完全匹配。如果你研究文档,你会发现很多小东西。比如它是如何做到贪婪的。惰性匹配
就我在正则表达式解析器中看到的情况而言,捕获是如何列出的是非常典型的。捕获列表首先列出所有捕获组,然后列出第一个捕获组(或第一组括号中包含的内容)
要查找更多匹配项,必须迭代调用indexIn
希望这能有所帮助。您缺少两件事。请跳过反斜杠,然后使用
setMinimal
。请参见下文
QString line = "messages:[2013-10-08 09:13:41] NOTICE[2366] chan_sip.c: Registration from '\"xx000 <sip:xx000@183.229.164.42:5060>' failed for '192.187.100.170' - No matching peer found";
QRegExp rx_timestamp("\\[(.*)\\]");
rx_timestamp.setMinimal(true);
int pos = rx_timestamp.indexIn(line);
if (pos > -1) {
qDebug() << "Captured texts: " << rx_timestamp.capturedTexts();
qDebug() << "timestamp cap: " <<rx_timestamp.cap(0);
qDebug() << "timestamp cap: " <<rx_timestamp.cap(1);
qDebug() << "timestamp cap: " <<rx_timestamp.cap(2);
} else qDebug() << "No indexin";
更新:发生了什么:
<> P>一个C++源代码中的反斜杠表示下一个字符是一个转义字符,如<代码> \n>代码>。要在正则表达式中显示反斜杠,必须避免像这样的反斜杠:<代码> \\代码>,这样它就可以使正则表达式引擎看到<代码> \/>代码,就像露比、perl或Python所使用的一样。p>
方括号也应该转义,因为它们通常用于表示正则表达式中的元素范围
因此,要让正则表达式引擎看到方括号字符,需要发送它
\[
< >但是C++源文件不能将<代码> \/COD>字符放入一个没有两行的字符串中,因此它变成了
\\[
在学习正则表达式时,我喜欢使用它。它在页面右侧有一个独特代码和字符列表
QRegEx
与regex不完全匹配。如果你研究文档,你会发现很多小东西,比如它是如何进行贪婪与懒惰匹配的
就我在正则表达式解析器中所见,捕获列表是非常典型的。捕获列表首先列出了所有捕获,然后列出了第一个捕获组(或者第一组括号中包含的内容)
要查找更多匹配项,必须迭代调用indexIn
希望这能有所帮助。您缺少两件事。请跳过反斜杠,然后使用
setMinimal
。请参见下文
QString line = "messages:[2013-10-08 09:13:41] NOTICE[2366] chan_sip.c: Registration from '\"xx000 <sip:xx000@183.229.164.42:5060>' failed for '192.187.100.170' - No matching peer found";
QRegExp rx_timestamp("\\[(.*)\\]");
rx_timestamp.setMinimal(true);
int pos = rx_timestamp.indexIn(line);
if (pos > -1) {
qDebug() << "Captured texts: " << rx_timestamp.capturedTexts();
qDebug() << "timestamp cap: " <<rx_timestamp.cap(0);
qDebug() << "timestamp cap: " <<rx_timestamp.cap(1);
qDebug() << "timestamp cap: " <<rx_timestamp.cap(2);
} else qDebug() << "No indexin";
更新:发生了什么:
<> P>一个C++源代码中的反斜杠表示下一个字符是一个转义字符,如<代码> \n>代码>。要在正则表达式中显示反斜杠,必须避免像这样的反斜杠:<代码> \\代码>,这样它就可以使正则表达式引擎看到<代码> \/>代码,就像露比、perl或Python所使用的一样。p>
方括号也应该转义,因为它们通常用于表示正则表达式中的元素范围
因此,要让正则表达式引擎看到方括号字符,需要发送它
\[
< >但是C++源文件不能将<代码> \/COD>字符放入一个没有两行的字符串中,因此它变成了
\\[
在学习正则表达式时,我喜欢使用它。它在页面右侧有一个独特代码和字符列表
QRegEx
与regex不完全匹配。如果你研究文档,你会发现很多小东西,比如它是如何进行贪婪与懒惰匹配的
就我在正则表达式解析器中所见,捕获列表是非常典型的。捕获列表首先列出了所有捕获,然后列出了第一个捕获组(或者第一组括号中包含的内容)
要查找更多匹配项,必须迭代调用indexIn
希望这能有所帮助。您缺少两件事。请跳过反斜杠,然后使用
setMinimal
。请参见下文
QString line = "messages:[2013-10-08 09:13:41] NOTICE[2366] chan_sip.c: Registration from '\"xx000 <sip:xx000@183.229.164.42:5060>' failed for '192.187.100.170' - No matching peer found";
QRegExp rx_timestamp("\\[(.*)\\]");
rx_timestamp.setMinimal(true);
int pos = rx_timestamp.indexIn(line);
if (pos > -1) {
qDebug() << "Captured texts: " << rx_timestamp.capturedTexts();
qDebug() << "timestamp cap: " <<rx_timestamp.cap(0);
qDebug() << "timestamp cap: " <<rx_timestamp.cap(1);
qDebug() << "timestamp cap: " <<rx_timestamp.cap(2);
} else qDebug() << "No indexin";
更新:发生了什么:
<> P>一个C++源代码中的反斜杠表示下一个字符是一个转义字符,如<代码> \n>代码>。要在正则表达式中显示反斜杠,必须避免像这样的反斜杠:<代码> \\代码>,这样它就可以使正则表达式引擎看到<代码> \/>代码,就像露比、perl或Python所使用的一样。p>
方括号也应该转义,因为它们通常用于表示正则表达式中的元素范围
因此,要让正则表达式引擎看到方括号字符,需要发送它
\[
< >但是C++源文件不能将<代码> \/COD>字符放入一个没有两行的字符串中,因此它变成了
\\[
在学习正则表达式时,我喜欢使用它。它在页面右侧有一个独特代码和字符列表