正如标题所说,我需要在一个句子中找到两个特定的单词。但它们可以是任何顺序和任何外壳。我如何使用正则表达式进行此操作?
例如,我需要从下面的句子中提取单词test
和long
,无论单词test
是第一个还是long
。
This is a very long sentence used as a test
更新: 我在第一部分中没有提到的是它也需要不区分大小写。
答案 0 :(得分:33)
答案 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
将以任意顺序匹配包含test
和long
的行。
有关使用的更多信息,请参见this answer。我不知道任何其他实现分支的正则表达式。 Regular Expression维基百科条目上甚至都没有记录该操作员。
答案 7 :(得分:-2)
我认为你不能用一个正则表达式做到这一点。你需要用两个逻辑AND - 一个搜索每个单词。