Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QRegExp一次匹配包含N个单词的行,但不考虑顺序(即逻辑AND)_C++_Regex_Qt_Qregexp - Fatal编程技术网

C++ QRegExp一次匹配包含N个单词的行,但不考虑顺序(即逻辑AND)

C++ QRegExp一次匹配包含N个单词的行,但不考虑顺序(即逻辑AND),c++,regex,qt,qregexp,C++,Regex,Qt,Qregexp,我有一个包含多行文本的文件,我只想匹配那些包含多个单词的行所有单词都必须出现在该行中,但是它们可以以任何顺序出现 因此,如果我们想匹配1、2、3,那么下面的前2行将匹配: three one four two <-- match four two one three <-- match one two four five three three three 3-1-4-2是的,这是可能的。使用一个。这将检查主题字符串的以下部分,而不会实际使用它们。这意味着在lookahead完成后

我有一个包含多行文本的文件,我只想匹配那些包含多个单词的行所有单词都必须出现在该行中,但是它们可以以任何顺序出现

因此,如果我们想匹配1、2、3,那么下面的前2行将匹配:

three one four two <-- match
four two one three <-- match
one two four five
three three three
3-1-4-2是的,这是可能的。使用一个。这将检查主题字符串的以下部分,而不会实际使用它们。这意味着在lookahead完成后,正则表达式引擎将跳回它开始的位置,您可以运行另一个lookahead(当然,在本例中,您从字符串的开头使用它)。试试这个:

^(?=[^\r\n]*one)(?=[^\r\n]*two)(?=[^\r\n]*three)[^\r\n]*$
被求反的字符类
[^\r\n]
确保我们永远看不到行尾。因为lookaheads实际上不会为匹配消耗任何东西,所以我们在末尾(lookaheads之后)添加
[^\r\n]*
,并在行尾添加
$
。事实上,您可以省略
$
,因为
*
的贪婪性,但我认为它使表达式的含义更加明显

确保在多行模式下使用此正则表达式(以便
^
$
匹配行的开头)

编辑:

对不起,显然:

QRegExp没有与Perl的/m选项等效的选项,但可以通过多种方式进行模拟,例如通过将输入拆分为行或使用搜索换行符的regexp循环

它甚至建议将字符串拆分为行,这是您想要避免的

由于QRegExp也不支持lookbehinds(这将有助于模拟
m
),所以其他解决方案有点棘手。你可以和我一起去

(?:^|\r|\n)(?=[^\r\n]*one)(?=[^\r\n]*two)(?=[^\r\n]*three)([^\r\n]*)

那么您想要的行应该在捕获组
1
中。但我认为将字符串拆分为行可能会产生比这更可读的代码。

您可以使用新Qt5中的
多行选项
pattern选项,如:


谢谢,现在我想了想,这可能对性能没有多大影响,即使现在大部分时间似乎都花在读取硬盘上的文本上-文件相当大,我一直在想办法提高性能。@satuon在尝试提高性能之前,您应该始终配置文件以查找瓶颈。可能发生的最坏情况是:a)花费不必要的时间,b)损害代码的可读性,只是为了优化程序的一部分,而这一部分甚至不会产生任何影响。但至少现在您知道了,如何使用正则表达式断言多个模式,而不考虑顺序;)是的,现在我想起来了,也许我可以生成grep,它有多行模式吗?@satuon不确定,但我相信grep默认情况下可能在多行模式下工作(这是有意义的)
QRegularExpression("\\w+", QRegularExpression::MultilineOption)