2016-08-09 4 views
0

MySQL: Я пытаюсь сопоставить слово («якорь») и большинство вариантов этого слова («якорь»/«якорь», «якорь»/«женщина-якорь», «со-якорь», «привязанный» 'и т. д.), но я хочу специально исключить «привязку». Есть ли способ сделать это?MySQL: регулярное выражение соответствует вариациям слова, но не одному варианту?

я писал: table.column regexp '[[:<:]]anchor[^age]'

Слова, которые я хочу, чтобы включить являются:

anchor co-anchor anchored anchorman anchor man anchorwoman anchor woman anchoring

но не anchorage

Проблема с запросом, что это вынимая anchored.

+1

Неправильно использовать 'where column like '% anchor%' и column! = 'anchorage' '? – sgeddes

+0

POSIX-движок недостаточно мощный, чтобы сделать это с помощью одного регулярного выражения. В противном случае ответ должен был бы использовать отрицательный результат:' anchor (?! Age) ' – 4castle

+0

@sgeddes, который работает! Я пытался обобщить, но в то же время, наверное, я не был. благодаря! –

ответ

0

Общий случай этой задачи называется «stemning», и это, как известно, сложно.

Но, давайте ответ на ваш конкретный вопрос:

column REGEXP '[[:<:]](co-)?anchor(|man|woman|ed|ing)[[:>:]]' 

должны соответствовать вашим потребностям. Объяснение:

[[:<:]]  beginning of word 
(co-)?  optional "co-" prefix 
anchor  the root of the word you want to recognize 
(|man|woman|ed|ing) several alternative suffixes. The first alternative is empty. 
[[:>:]]  end of word. 

Заметим, что это будет соответствовать «якорь человек», «якорь женщина» и «якорь гуся».

Обратите внимание, что ваш пример содержит [^age]. Это означает, что «любой одиночный символ, кроме, г или д. Не совсем то, что вы хотите.

+0

Должен ли я использовать? (| Man | woman | ed | ing) в случае, если слово просто «якорь»? –

+0

@GinaLee Регулярное выражение уже соответствует 'anchor'. Нет необходимости в '?' – 4castle

+0

также, '' 'regexp '[[: <:]] anchor (man | woman | ed | ing)? [[:>:]]'' '' Оказался лучше, чем запрос , –

0

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

where replace(column, 'anchorage', '') like '%anchor%' 

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

Смежные вопросы