Несколько слов в любом порядке с использованием регулярного выражения

Как гласит название, мне нужно найти два конкретных слова в предложении. Но они могут быть в любом порядке и в любом корпусе. Как мне сделать это с помощью регулярного выражения?

Например, мне нужно извлечь слова test и long из следующего предложения, прежде чем наступит слово test или long.

This is a very long sentence used as a test

UPDATE: То, что я не упомянул в первой части, заключается в том, что оно также должно быть нечувствительным к регистру.

Ответ 1

Используйте группу захвата, если вы хотите извлечь совпадения: (test) | (long) Затем, в зависимости от используемого языка, вы можете ссылаться на соответствующую группу, используя, например, $1 и $2.

Ответ 3

Я предполагаю (всегда опасно), что вы хотите найти целые слова, поэтому "тест" будет соответствовать, но "testy" не будет. Таким образом, шаблон должен искать границы слов, поэтому я использую шаблон границы слова "\ b".

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

Ответ 4

не зная, на каком языке

 /test.*long/ 

или

/long.*test/

или

/test/ && /long/

Ответ 5

Попробуйте следующее:

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

Это будет соответствовать test, а затем long или long, а затем test. Он будет игнорировать различия в данных.

Ответ 6

Я использовал libpcre с C, где я мог определять выноски. Они помогли мне легко совместить не только слова, но и любые подвыражения в любом порядке. Регулярное выражение выглядит так:

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

и функция выноски защищает то, что каждое подвыражение сопоставляется ровно один раз, например:

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.

Ответ 7

Я не думаю, что вы можете сделать это с помощью одного регулярного выражения. Вам понадобится логическое И из двух - поиск каждого слова.