Ответ 1
Используйте группу захвата, если вы хотите извлечь совпадения: (test) | (long) Затем, в зависимости от используемого языка, вы можете ссылаться на соответствующую группу, используя, например, $1 и $2.
Как гласит название, мне нужно найти два конкретных слова в предложении. Но они могут быть в любом порядке и в любом корпусе. Как мне сделать это с помощью регулярного выражения?
Например, мне нужно извлечь слова test
и long
из следующего предложения, прежде чем наступит слово test
или long
.
This is a very long sentence used as a test
UPDATE: То, что я не упомянул в первой части, заключается в том, что оно также должно быть нечувствительным к регистру.
Используйте группу захвата, если вы хотите извлечь совпадения: (test) | (long) Затем, в зависимости от используемого языка, вы можете ссылаться на соответствующую группу, используя, например, $1 и $2.
Вы можете использовать
(?=.*test)(?=.*long)
Источник: MySQL SELECT LIKE или REGEXP для сопоставления нескольких слов в одной записи
Я предполагаю (всегда опасно), что вы хотите найти целые слова, поэтому "тест" будет соответствовать, но "testy" не будет. Таким образом, шаблон должен искать границы слов, поэтому я использую шаблон границы слова "\ b".
/(?i)(\btest\b.*\blong\b|\blong\b.*\btest\b)/
не зная, на каком языке
/test.*long/
или
/long.*test/
или
/test/ && /long/
Попробуйте следующее:
/(?i)(?:test.*long|long.*test)/
Это будет соответствовать test
, а затем long
или long
, а затем test
. Он будет игнорировать различия в данных.
Я использовал 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.
Я не думаю, что вы можете сделать это с помощью одного регулярного выражения. Вам понадобится логическое И из двух - поиск каждого слова.