使用正则表达式的任何顺序的多个单词

时间:2009-07-24 11:30:57

标签: regex

正如标题所说,我需要在一个句子中找到两个特定的单词。但它们可以是任何顺序和任何外壳。我如何使用正则表达式进行此操作?

例如,我需要从下面的句子中提取单词testlong,无论单词test是第一个还是long

This is a very long sentence used as a test

更新: 我在第一部分中没有提到的是它也需要不区分大小写。

8 个答案:

答案 0 :(得分:33)

您可以使用

(?=.*test)(?=.*long)

来源:MySQL SELECT LIKE or REGEXP to match multiple words in one record

答案 1 :(得分:9)

我认为(总是危险的)你想找到整个单词,所以“test”会匹配,但“testy”不会。因此,模式必须搜索字边界,因此我使用“\ b”字边界模式。

/(?i)(\btest\b.*\blong\b|\blong\b.*\btest\b)/

答案 2 :(得分:7)

如果要提取匹配项,请使用捕获组:(测试)|(长) 然后,根据使用的语言,您可以使用$ 1和$ 2来引用匹配的组。

答案 3 :(得分:4)

不知道用什么语言

 /test.*long/ 

/long.*test/

/test/ && /long/

答案 4 :(得分:3)

试试这个:

/(?i)(?:test.*long|long.*test)/

这将匹配test然后long,或long,然后test。它将忽略案例差异。

答案 5 :(得分:1)

我正在使用带有C的libpcre,我可以在其中定义标注。他们帮助我轻松匹配不仅仅是单词,而是任何顺序的任何子表达式。正则表达式如下:

(?C0)(expr1(?C1)|expr2(?C2)|...|exprn(?Cn)){n}

并且callout函数保护每个子表达式只匹配一次,如:

int mycallout(pcre_callout_block *b){
static int subexpr[255];
if(b->callout_number == 0){
    //callout (?C0) - clear all counts to 0
    memset(&subexpr,'\0',sizeof(subexpr));
    return 0;
}else{
    //if returns >0, match fails
    return subexpr[b->callout_number-1]++;
}
}

在perl中也应该有类似的东西。

答案 6 :(得分:0)

Vim有一个分支运算符\&,当搜索包含任意数量的单词的行时,它可以允许偶数正则表达式。

例如,

/.*test\&.*long

将以任意顺序匹配包含testlong的行。

有关使用的更多信息,请参见this answer。我不知道任何其他实现分支的正则表达式。 Regular Expression维基百科条目上甚至都没有记录该操作员。

答案 7 :(得分:-2)

我认为你不能用一个正则表达式做到这一点。你需要用两个逻辑AND - 一个搜索每个单词。