Использование отрицательного взгляда на Regex в MySQL - PullRequest
1 голос
/ 19 марта 2020

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

, но когда я SELECT * FROM table where column regexp '(?<!\.)\.{2}(?!\.)' я получаю сообщение об ошибке. Кажется, что Mysql не поддерживает отрицательный прогноз. Как я могу это исправить?

1 Ответ

0 голосов
/ 19 марта 2020

Вы можете использовать группы, так как все, что вам нужно, это логический результат, и совпадение ищется только один раз:

SELECT * FROM table where column regexp '([^.]|^)[.]{2}([^.]|$)'

Подробности

  • ([^.]|^) - любой символ, кроме . или начало строки
  • [.]{2} - две точки
  • ([^.]|$) - любой символ, кроме . или конец строки

Обратите внимание, что любая запись, содержащая эту подстроку, будет возвращена, даже если есть подстроки ..., например abc...bc... Чтобы избежать этого, вы можете просто использовать

SELECT * FROM table where column     LIKE '%..%'
                      AND column NOT LIKE '%...%'

LIKE требует полного сопоставления с шаблоном, поэтому % соответствует любым 0 или более символам с начала, .. или ... соответствуют двум или три точки, а затем % соответствует остальной части строки.

...