сопоставление целых слов при игнорировании аффиксов слов с использованием регулярного выражения

Я изучаю новый язык, и я создал БД с прибл. 2500 слов и 2500 примеров слов. Я создал веб-интерфейс PHP/MySQL, в котором в основном отображаются изображения для каждого слова, и когда вы нажимаете на них, он воспроизводит звук слова. Существует также контекстное меню для запуска всплывающего элемента div, который соответствует и отображает все примеры, в которых встречается слово.

Я использую REGEXP '[[:<:]]$word[[:>:]]', но есть несколько префиксов/суффиксов слов, которые я хочу отфильтровать, которые не добавляют к слову реального значения (например, суффикс -ing в английском языке). Один из способов обойти это - поставить дефис в слове, где начинается аффикс, чтобы регулярное выражение по-прежнему соответствовало слову, но это не совсем верно для того, как язык обрабатывает правописание. Также есть разные сочетания слов, которые я не хочу фильтровать, потому что смысл совсем другой. Не вдаваясь в подробности, вот несколько псевдопримеров с совпадающим словом как просто «WORD» и префиксами и суффиксами, которые я хочу фильтровать как pre1, pre2... и suf1, suf2... и вещи, которые я не хочу фильтровать как xxx

1. Xxx xxx WORDsuf1 xxx xxx xxx.
2. Xxx xxx WORDsuf2 xxx xxx xxx.
3. Xxx xxx pre1WORDsuf1 xxx xxx xxx.
4. Xxx xxx WORD xxx xxx xxx.
5. Xxx xxx pre1WORD xxx xxx xxx.
6. Xxx xxx pre2WORDxxx xxx xxx xxx.
7. Xxx xxx xxxWORDxxx xxx xxx xxx.
8. Xxx xxx pre1WORDxxxsuf1 xxx xxx xxx.
9. Xxx xxx pre1xxxWORDsuf1 xxx xxx xxx.
10. Xxx xxx xxxWORDxxx xxx xxx xxx.

в приведенных выше примерах я хочу сопоставить 1, 2, 3, 4, 5, но я не хочу сопоставлять 6, 7, 8, 9, 10. Я начал просто добавлять предложения OR, например:

REGEXP  '[[:<:]$word[[:>:]]|[[:<:]]$word$suffix[[:>:]]'

Это отлично работает для одного исключения, но с несколькими исключениями становится грязно.

По общему признанию, я довольно неопытен с регулярными выражениями, и большая часть того, что мне удается решить, - это простые примеры, которые мне нужно прочитать. Можно ли это сделать с помощью короткого и эффективного регулярного выражения?


person user3787683    schedule 13.07.2014    source источник
comment
Является ли pre1WORDsuf2 допустимым совпадением?   -  person Braj    schedule 13.07.2014
comment
да, pre1WORDsuf2 совпадает. По сути, у меня есть список префиксов и суффиксов, которые нужно игнорировать, и пока они являются единственными элементами, добавляемыми к корню, любая их комбинация является совпадением.   -  person user3787683    schedule 13.07.2014
comment
посмотрите на ответ и демо.   -  person Braj    schedule 13.07.2014


Ответы (1)


Это то, что вы ищете?

(\b(pre1|pre2)?WORD(suf1|suf2)?\b)

Онлайн-демонстрация

Если вы ищете всю строку как совпадение, попробуйте ниже регулярное выражение и получите, если из совпадающей группы по индексу 1

(.*(\b(pre1|pre2)?WORD(suf1|suf2)?\b).*)

Онлайн-демонстрация

Используйте preg_match_all, чтобы получить все совпадающие группы.

person Braj    schedule 13.07.2014
comment
спасибо, отлично работает. за исключением того, что в mysql границы слов разные. Я использовал: REGEXP '[[:‹:]](pre1|pre2)?word(suf1|suf2)?[[:›:]]' - person user3787683; 13.07.2014
comment
Я понятия не имею о php, я просто поделился с вами шаблоном регулярного выражения. ПОСЕЩЕНИЕ - person Braj; 13.07.2014