Я думаю, вы получите следующее регулярное выражение: "((?:[^"]|\\")*)":(\S*/)(?=\s)
. Разбивая это:
"
соответствует буквальной кавычке.
- `(?: [^"] | \ ") * Соответствует (без захвата) внутренностям; любое число (ноль или более):
[^"]
, символ без кавычек или
\\"
, экранированная цитата.
"
соответствует буквальной кавычке.
:
соответствует буквальному двоеточию.
\S*
соответствует нулю или более непробельных символов
/
соответствует буквальному слешу
(?=\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 ...
, но для чего это нужно? Причина, по которой я спрашиваю, состоит в том, что эта задача больше не подходит для регулярных выражений. Вы должны использовать парсер или что-то в этом роде. И в зависимости от того, почему вы это делаете, это может быть возможно.