Отрицательные обратные ссылки в MySQL REGEXP - PullRequest
3 голосов
/ 08 ноября 2010

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

Я пытаюсь создать запрос с RLIKE, который соответствует следующему.

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

Допустим, у меня есть некоторые определенные слова, которые можно использовать в регулярном выражении:

hello, dog

У меня есть следующие предложения в базе данных:

hello from dog
hello hello cat
dog says hello
dog dog goes away
big bad dog

Из всех, кого я хочу сопоставить только

hello from dog
dog says hello

Пока у меня это так:

SELECT *
FROM test
WHERE 
test RLIKE '(hello|dog).*(hello|dog)'

Проблема в том, что я получаю и ненужные

hello hello cat
dog dog goes away

Так что, я думаю, мне нужна обратная ссылка прямо перед второй (привет | собака).

Впсевдокод это выглядело бы так:

RLIKE '(hello OR dog) anything can be here (hello OR dog, but not the word which already was in the previous group)'

, поэтому могло бы быть так:

'(hello|dog).*(negative backreference to the 1st group goes here)(hello|dog)'

Можно ли сделать такую ​​отрицательную обратную ссылку в регулярном выражении MySQL?Или, может быть, есть лучший способ написать регулярное выражение, которое делает то же самое, но также учитывая, что запрос будет сгенерирован каким-то кодом C ++, поэтому он не должен быть слишком сложным для генерации?

1 Ответ

5 голосов
/ 08 ноября 2010

MySQL использует механизм расширенного регулярного выражения Posix ( POSIX ERE ) и поэтому вообще не поддерживает обратные ссылки. Он также не поддерживает lookaround, который вам понадобится для создания одного регулярного выражения, которое могло бы справиться с этим.

Поэтому вы должны прописать все возможные комбинации:

hello.*dog|dog.*hello

Конечно, это станет громоздким, если число кандидатов на совпадение увеличится, поэтому регулярные выражения не являются подходящим инструментом для этого в MySQL, если вы не можете установить / использовать LIB_MYSQLUDF_PREG .

...