Есть ли регулярное выражение для поиска двух разных слов в предложении?

Есть ли регулярное выражение для поиска двух разных слов в предложении? Дополнительный кредит для выражения, которое работает в MS Visual Studio 2008 :)

Например:

reg_ex_match(A, B, "A sentence with A and B") = true
reg_ex_match(C, D, "A sentence with A and B") = false

См. также этот связанный вопрос


person Thomas Bratt    schedule 06.02.2009    source источник
comment
Попробуйте привести полный пример того, что вы хотите, чтобы произошло? Это ИЛИ или И вам нужно? Какой диапазон символов разрешен в A, B, C и D?   -  person AnthonyWJones    schedule 06.02.2009
comment
Что именно вы подразумеваете под словом «слово»? Последовательность, которая либо разделена пробелами, либо находится в начале или в конце строки?   -  person Gumbo    schedule 06.02.2009


Ответы (7)


Для реальных слов:

\bA\b.+\bB\b|\bB\b.+\bA\b
person Gumbo    schedule 06.02.2009
comment
Я думаю, это зависит от того, что подразумевается под словами ОП. И вторая половина вашего выражения — двойная буква «Б». - person alphadogg; 06.02.2009
comment
Кроме того, обратите внимание, что граница слова может быть не тем, что вам нужно. Для OP, AB каждый раз одно слово или два? Пример: фамилия иногда пишется через дефис. - person alphadogg; 06.02.2009

".*A.*B.*|.*B.*A.*" Вы можете добавить пробелы вокруг слов A и B, если вам нужны правильные слова.

person Łukasz Lew    schedule 06.02.2009
comment
Осторожный. Это будет соответствовать предложению с AB. Близко, однако. - person alphadogg; 06.02.2009
comment
Что было бы правильным поведением. Если вы определяете слово как отдельное слово, то, как я уже сказал, вы должны добавить пробелы вокруг. - person Łukasz Lew; 06.02.2009
comment
Пробелы не помогут, потому что слово может быть в начале или в конце строки. В этом случае его все равно следует считать отдельным словом, но без пробела перед/после него. См. решение @Gumbos, используя \b для реального решения. - person Joachim Sauer; 06.02.2009
comment
Будьте осторожны с границами слов. Я видел, как многие люди были укушены тем, что не понимали, что некоторые слова, которые у них были в их наборе данных, содержали символы, не входящие в определение границы для любого вида регулярного выражения, которое они использовали. - person alphadogg; 06.02.2009
comment
Это также будет соответствовать AUTOBAHN или BAILOUT, поскольку .* также будет соответствовать словесным символам, которые окружают или находятся между A и B (или B и A). Это даже соответствовало бы чему-то вроде И всегда обязательно смотрите в обе стороны, прежде чем переходить улицу. - person Bryan; 07.02.2009

Почему бы не использовать логическую логику вместо сложного регулярного выражения?

Код не проверен:

public bool reg_ex_match(Regex A, Regex B, string s) {
    return A.isMatch(s) && B.isMatch(s);
}

Обновление: предполагается, что A и B определены с границами слов:

Regex A = new Regex(@"\bA\b");
person toolkit    schedule 06.02.2009
comment
Это не работает, если A=foo и B=foomator, тогда он вернет true, потому что это foomator. - person Łukasz Lew; 06.02.2009

.*A.*\s.*B.*|.*B.*\s.*A.*

Обратите внимание на использование «+» между A и B. Это сделано для того, чтобы убедиться, что вы соответствуете отдельным A и B. Если это не является обязательным требованием, то ответ Лукаша Лью правильный.

ОБНОВЛЕНИЕ: Изменено в соответствии с превосходным наблюдением Брайана ниже. Приведенное выше выражение распознает A, отделенное от B (или наоборот) хотя бы одним пробельным символом (пробелом, табуляцией или разрывом строки) между двумя интересующими областями.

person alphadogg    schedule 06.02.2009
comment
Предполагая, что предложение не разделено символом разрыва строки. (Поскольку это не будет соответствовать '.') - person alphadogg; 06.02.2009
comment
Вероятно, вы имели в виду .*A.+B.*|.*B.+A.* - person Łukasz Lew; 06.02.2009
comment
Не совсем. Это правильный синтаксис регулярных выражений, хотя его может потребоваться адаптировать к любой среде, в которой вы его используете... - person alphadogg; 06.02.2009
comment
Я имел в виду, что вам нужно \, чтобы * появился в вашем ответе :) - person Łukasz Lew; 06.02.2009
comment
Если вы говорите о предотвращении интерпретации звездочки как разметки, правильный способ — либо заключить текст в backticks, либо поместить его на отдельной строке с отступом в четыре пробела. - person Alan Moore; 06.02.2009
comment
Это имеет ту же проблему, что и регулярное выражение Лукаша Лью. Он будет соответствовать непреднамеренным целям, таким как AMBIENT или BLANK. - person Bryan; 07.02.2009

регулярное выражение

Следующее регулярное выражение соответствует всей строке, только если строка содержит все слова: all your words here. Вы можете легко добавить другие слова или удалить существующие.

(?=.*?\ball\b)
(?=.*?\byour\b)
(?=.*?\bwords\b)
(?=.*?\bhere\b)
.*

Не так сложно.

person mmdemirbas    schedule 31.08.2012

Выражение регулярного выражения, которое вы ищете, выглядит примерно так:

/word1.*(?=word2)|word2.*(?=word1)/igm

Это также без учета регистра и может применяться к многострочному тексту.

Проверено на http://regexr.com/

person Joshua Pinter    schedule 12.04.2014

Попробуйте поискать в regexlib, хранилище регулярных выражений.

person Kon    schedule 06.02.2009
comment
В любом случае это плохой совет. Качество регулярных выражений на этом сайте повсюду, а экспертная оценка практически отсутствует. - person Alan Moore; 13.04.2014