以任何顺序使用正则expression式的多个单词

正如标题所说,我需要在一个句子中find两个特定的单词。 但他们可以以任何顺序和任何套pipe。 我如何去做这个使用正则expression式?

例如,我需要从下面的句子中提取单词testlong是否来自first或long这个单词。

 This is a very long sentence used as a test 

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

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

您可以使用

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

来源: MySQL SELECT LIKE或REGEXP匹配一个logging中的多个单词

我认为(总是危险的),你想find整个单词,所以“testing”将相匹配,但“testing”不会。 因此,模式必须search字边界,所以我使用“\ b”字边界模式。

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

尝试这个:

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

这将匹配test ,然后long ,或long ,然后test 。 它会忽略大小写的差异。

不知道什么语言

  /test.*long/ 

要么

 /long.*test/ 

要么

 /test/ && /long/ 

我用libpcre和C,在那里我可以定义标注。 他们帮助我轻松地匹配不只是单词,而是任何次序的任何子expression。 正则expression式看起来像:

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

标注函数会保护每个子expression式只匹配一次,如:

 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中。

我不认为你可以用一个正则expression式。 你需要达到逻辑与二 – 一个search每个单词。