регулярное выражение поиск в текстовом столбце MySQL - PullRequest
0 голосов
/ 28 мая 2010

Хорошо, я думал, что моя голова болит от регулярного регулярного выражения, но я не могу найти то, что я ищу с регулярным выражением в mysql.

Я пытаюсь найти ситуации в новостных статьях, где текстовый URL не заканчивался косой чертой, так:

«Кэтрин Зета-Джонс»: / cr / catherinezeta-jones / переполнение стека в порядке, но «Кэтрин Зета-Джонс»: / cr / catherinezeta-jones переполнение стека не выполнено.

[просто использовал Кэтрин в качестве примера, потому что я предполагаю, что альфа-поиск не поймает дефис]

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

Спасибо всем!

1 Ответ

1 голос
/ 28 мая 2010

Я думаю, вы получите следующее регулярное выражение: "((?:[^"]|\\")*)":(\S*/)(?=\s). Разбивая это:

  1. " соответствует буквальной кавычке.
  2. `(?: [^"] | \ ") * Соответствует (без захвата) внутренностям; любое число (ноль или более):
    • [^"], символ без кавычек или
    • \\", экранированная цитата.
  3. " соответствует буквальной кавычке.
  4. : соответствует буквальному двоеточию.
  5. \S* соответствует нулю или более непробельных символов
  6. / соответствует буквальному слешу
  7. (?=\s) - это взгляд в будущее, соответствующий, если следующий символ - любой символ пробела.

После этого первая группа захвата (часто $1) будет содержать текст ссылки, а $2 будет содержать URL ссылки. Он будет соответствовать только ссылкам нужного вам формата. Если вы хотите сопоставить все ссылки, просто удалите /, а затем удалите все URL, которые не заканчиваются на одну.


Редактировать: Насколько я могу судить, MySQL, по-видимому, не имеет \s, \S, (?:...) или (?=...). Заменить \s и \S просто: просто используйте [[:blank:]] и [^[:blank:]]. Заменить (?:...) также легко, поскольку я полагаю, что в этом контексте вам все равно, какие группы фиксируют что: просто замените все (?:...) на (...). Замена промежуточного взгляда в целом сложна, но должна быть возможной в этом контексте: насколько я могу судить, вам на самом деле все равно, будет ли место в конце включено в совпадение. Таким образом, вы можете просто сопоставить то, что вы хотите смотреть вперед, вместо того, чтобы просто смотреть вперед (или конец строки, $, который я оставил в своем первом ответе). Чтобы немного уточнить, вот два регулярных выражения:

  • "(([^"]|\\")*)":([^[:space:]]*/)([[:space:]]|$), который соответствует текстовым URL, которые do заканчиваются косой чертой; или
  • [Редактировать: не работает!] "(([^"]|\\")*)":([^[:space:]]*[^/])([[:space:]]|$), что соответствует текстовым URL, которые не заканчиваются косой чертой.

Редактировать: То, что у меня было в прошлый раз почти работал. Тем не менее, рассмотрим что-то вроде "text":/url/. [^[:space:]]* будет захватывать /url/, [^/] будет захватывать первый пробел, а ([[:space:]]|$) - второй, сообщая вам, что он не совпадает. Чтобы исправить это, мы говорим, что последний символ URL должен также быть непробельным символом. Выполнение этого и удаление некоторых лишних скобок дает нам

  • "([^"]|\\")*":[^[:space:]]*/([[:space:]]|$), который соответствует текстовым URL, которые do заканчиваются косой чертой; или
  • "([^"]|\\")*":[^[:space:]]*[^/[:space:]]([[:space:]]|$), который соответствует текстовым URL, которые не заканчиваются косой чертой.

Это почти достаточно хорошо. Однако это не совсем так. Хотя пунктуация, такая как ,, технически допустима в URL, Textile запрещает это. Однако его правила для конца URL-адресов довольно расплывчаты: «обычная пунктуация… может находиться в конце URL-адреса». Более того, также возможно заключать ссылки в квадратные скобки, которые также выиграло это регулярное выражение поймать И это даже не начинает иметь дело с таблицами поиска ссылок.

Изменить вещи для работы с делом , легко: везде, где вы видите [:space:], замените его на [:space:], и добавьте все, что вам нужно после ,. Это связано с тем, что в приведенном выше регулярном выражении [:space:] означает «недопустимый символ URL». Изменить вещи, чтобы справиться с регистром скобок, сложнее, но, вероятно, лучше всего это сделать, обратившись к ] как запятая. И работа с таблицами поиска ссылок с этим регулярным выражением невозможна. Это может быть возможно с помощью регулярных выражений по типу (не проверено) ^[[:space:]]*\[[^\]]*\].*[^/]$, но я почти уверен, что это пропустит угловые случаи (либо получит слишком много, либо слишком мало, либо и то и другое), и в нем, вероятно, есть ошибки своя. Вы, конечно, не можете знать, используется ли когда-либо определенная ссылка, просто используя regexen.

Это последнее осложнение, поэтому, открывает другой вопрос: что именно вы делаете с этим? Я знаю, что сейчас вы делаете SELECT ... WHERE ..., но для чего это нужно? Причина, по которой я спрашиваю, состоит в том, что эта задача больше не подходит для регулярных выражений. Вы должны использовать парсер или что-то в этом роде. И в зависимости от того, почему вы это делаете, это может быть возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...