正则表达式多字搜索

时间:2008-10-16 22:26:10

标签: regex string

我用什么来搜索字符串中的多个单词?我希望逻辑运算是AND,以便所有单词都在字符串中的某个地方。我有一堆无意义的段落和一个简单的英文段落,我想通过指定几个常用词来缩小它,例如“the”和“and”,但希望它与我指定的所有单词匹配。

5 个答案:

答案 0 :(得分:11)

正则表达式支持“环视”条件,允许您在字符串中搜索术语,然后忘记结果的位置;从字符串的开头开始,用于下一个搜索词。这将允许以任何顺序在字符串中搜索一组单词。

这个的正则表达式是:

^(?=.*\bword1\b)(?=.*\bword2\b)(?=.*\bword3\b)

其中\b是单词边界,?=是外观修饰符。

如果您要搜索的单词数量可变,则需要使用循环构建此正则表达式字符串 - 只需在环视语法中包装每个单词并将其附加到表达式。

答案 1 :(得分:2)

首先,我不确定你要回的是什么......整句话?你的两个单词之间的单词?

类似的东西:

\b(word1|word2)\b(\w+\b)*(word1|word2)\b(\w+\b)*\.

(其中\b是您所用语言的单词边界) 将匹配包含两个单词中的任何一个或两者的完整句子。

你可能需要让它不区分大小写,这样如果它出现在句子的开头它仍然会匹配

答案 2 :(得分:2)

AND作为连接

^(?=.*?\b(?:word1)\b)(?=.*?\b(?:word2)\b)(?=.*?\b(?:word3)\b)

OR作为替代

^(?=.*?\b(?:word1|word2|word3)\b
^(?=.*?\b(?:word1)\b)|^(?=.*?\b(?:word2)\b)|^(?=.*?\b(?:word3)\b)

答案 3 :(得分:2)

也许使用language recognition chart识别英语会起作用。一些快速测试似乎有效(这假设段落仅由换行符分隔)。

正则表达式将与这些条件中的任何一个匹配... \ bword \ b是由边界单词分隔的单词\ b是一个单词结尾,只有单词将在要匹配的段落的任何位置匹配。

my @paragraphs = split(/\n/,$text);
for my $p (@paragraphs) {
    if ($p =~ m/\bthe\b|\band\b|\ban\b|\bin\b|\bon\b|\bthat\b|\bis\b|\bare\b|th|sh|ough|augh|ing\b|tion\b|ed\b|age\b|’s\b|’ve\b|n’t\b|’d\b/) {
       print "Probable english\n$p\n";
    }
}

答案 4 :(得分:0)

假设PCRE(Perl regexes),我不确定你是否可以轻松完成。 AND操作是正则表达式的连接,但是您希望能够置换单词出现的顺序,而不必正式生成排列。对于N个单词,当N = 2时,它是可以忍受的; N = 3,几乎没有;用N> 3,它不太可能被接受。因此,简单的迭代解决方案 - N regexes,每个单词一个,迭代确保每个单词都满意 - 看起来对我来说是最好的选择。