liaren
@liaren
Фрилансер, опенсорсер, тех лид

Регулярное выражение для поиска вида: слово1 * (слово2 -слово3 -слово4) * слово5

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

Например для запроса вида:

слово1 * (слово2 -слово3 -слово4) * слово5

Соответствубющими строками будут:

слово1 слово99 слово2 слово98 слово97 слово5
слово1 слово2 слово5

Не соответствующими:

слово1 слово99 слово2 слово98 СЛОВО4 слово97 слово5
слово1 СЛОВО3 слово2 слово5

Второй день бьюсь над этой задачей…
Буду очень благодарен если кто-нибудь поможет.

P.S. Это всё пишется для поиска по MySQL базе с использованием оператора REGEXP. Вариант с использованием Sphinx не подходит.
  • Вопрос задан
  • 7851 просмотр
Пригласить эксперта
Ответы на вопрос 5
^слово1(?=.*слово2)(?!.*слово3|.*слово4).*слово5$
Регулярное выражение при котором, строка начинается со слова слово1, заканчиваться словом слово5. Если между слово1 и слово5, есть слова слово3 или слово4 — строка не удовлетворяет шаблон. Так же обязательно между словами слово1 и слово5 должно встретится слово слово2.
Ответ написан
Регулярные выражения
Посмотри блок «Просмотр вперёд и назад» — там про исключение слов, ну и вообще всю страницу перечитай все очень легко расписано, если что — пиши в личку.
Ответ написан
Пример на PHP:
if(preg_match("#^слово1.*(слово2|слово3|слово4).*слово5$#isU","слово1 слово99 слово2 слово98 слово97 слово5")){
	echo 1;
} else {
	echo 2;
}

if(preg_match("#^слово1.*(слово2|слово3|слово4).*слово5$#isU","слово0 слово99 слово2 слово98 слово97 слово5")){
	echo 1;
} else {
	echo 2;
}

if(preg_match("#(?<!Сергей )Иванов#isU","Игорь Иванов")){
	echo 1;
} else {
	echo 2;
}

if(preg_match("#(?<!Сергей )Иванов#isU","Сергей Иванов")){
	echo 1;
} else {
	echo 2;
}
Ответ написан
@gelas
lookahead по-моему не поддерживается в mysql
как это сделать одним выражением пока придумать не могу, но может быть устроит такой вариант:
SELECT * FROM tbl_words
WHERE txt REGEXP «слово1.*(слово2).*слово5»
AND NOT txt REGEXP «слово1.*(слово3|слово4).*слово5»
Ответ написан
if(preg_match("#^слово1(?!.*слово2|.*слово3|.*слово4).*слово5$#isU","слово1 слово99 слово4 слово98 слово97 слово5")){
	echo 1;
} else {
	echo 2;
}


if(preg_match("#^слово1(?!.*слово2|.*слово3|.*слово4).*слово5$#isU","слово1 слово99 слово54 слово98 слово97 слово5")){
	echo 1;
} else {
	echo 2;
}


Как уже и говорил — все работает!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы