Думаю, вы получите следующее регулярное выражение: "((?:[^"]|\\")*)":(\S*/)(?=\s)
. Разрыв:
"
соответствует буквальной цитате.
- `(?: [^"] | \ ") * Соответствует (без захвата) внутренности; то есть любое число (ноль или более) либо:
[^"]
, не-кавычка или
\\"
, сбежавшие цитаты.
"
соответствует буквальной цитате.
:
соответствует буквальной толстой кишке.
\S*
соответствует нулю или более не-пробельных символов
/
соответствует Слеш
(?=\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. Вы должны использовать парсер или что-то в этом роде. И в зависимости от того, почему вы это делаете, это возможно.
plz показать нам, что у вас есть sofar .. на нем легче построить – lexu
Я думал, что SELECT article_id FROM news WHERE textilestory REGEXP '". *":/Cr /.* [[: alpha:]] [^/] ([[: punct:]] | [[: space:]]) 'сделает это.Это поиск статей со ссылками в них, но я думал, что [^ /] ([[: punct:]] | [[: space:]]) поймает, где URL не заканчивается на '/', но в пунктуации или пространстве. – Ian