2010-05-28 5 views
0

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

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

«Кэтрин Зета-Джонс»:/кр/catherinezeta-Джоунс/посетил переполнение стека это нормально, но «Кэтрин Зета-Джонс»:/cr/catherinezeta-jones посетили переполнение стека.

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

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

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

+1

plz показать нам, что у вас есть sofar .. на нем легче построить – lexu

+0

Я думал, что SELECT article_id FROM news WHERE textilestory REGEXP '". *":/Cr /.* [[: alpha:]] [^/] ([[: punct:]] | [[: space:]]) 'сделает это.Это поиск статей со ссылками в них, но я думал, что [^ /] ([[: punct:]] | [[: space:]]) поймает, где URL не заканчивается на '/', но в пунктуации или пространстве. – Ian

ответ

1

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

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

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


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

  • "(([^"]|\\")*)":([^[:space:]]*/)([[:space:]]|$), который соответствует Textile URL-адреса, которые сделать конец в слэше; или
  • [Edit: сломана]"(([^"]|\\")*)":([^[:space:]]*[^/])([[:space:]]|$), который соответствует Textile URL-адреса, которые сделать не конец в слэш.

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

  • "([^"]|\\")*":[^[:space:]]*/([[:space:]]|$), который соответствует Textile URL-адресов, которые сделать конец в слэш; или
  • "([^"]|\\")*":[^[:space:]]*[^/[:space:]]([[:space:]]|$), который соответствует Текстильным URL-адресам, которые не конец в косой чертой.

Это почти достаточно хорошо. Однако это не совсем так. Хотя знаки препинания, такие как ,, являются технически законными по URL-адресу, Textile запрещает его. Тем не менее, его правила для того, когда URL-адреса заканчиваются, довольно расплывчаты: "common punctuation … can reside at the end of a URL." Более того, также можно заключить ссылки в квадратных скобках, которые это регулярное выражение также не будет ловить. И это даже не начинает иметь дело с таблицами поиска ссылок.

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

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

+0

К сожалению, это не совместимое с MySQL регулярное выражение. – Ian

+0

Какая часть не совместима с MySQL? Взгляд? –

+1

Antal, Спасибо за вашу работу! Второе регулярное выражение (не заканчивается на/1) все еще кажется запущенным в этом предложении [его подруга, «Кэтрин Зета-Джонс»:/cr/catherinezeta-jones /, занялась], хотя она заканчивается на/, Я задавался вопросом, может ли это быть из-за пунктуации, поэтому я отредактировал конец ([[: space:]] | $ | [[: punct:]]). Он все еще нашел это, хотя я не понимаю, почему это происходит. – Ian

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