Совпадение всех URL-адресов "http" без дополнительных символов - PullRequest
0 голосов
/ 13 июля 2010

Я попробовал следующие выражения.

(http:\/\/.*?)['\"\< \>]


(http:\/\/[-a-zA-Z0-9+&@#\/%?=~_|!:,.;\"]*[-a-zA-Z0-9+&@#\/%=~_|\"])

Первый работает хорошо, но всегда дает последний дополнительный символ с соответствующими URL.

Например:

http://domain.com/path.html" 

http://domain.com/path.html<

Примечание

" <

Я не хочу их с URL.

Ответы [ 3 ]

7 голосов
/ 13 июля 2010

Вы можете использовать lookahead вместо ['\"\< >] части вашего матча, то есть:

(http:\/\/.*?)(?=['\"\< >])

Вообще говоря, тогда как ab соответствует ab, a(?=b) соответствует a (еслиза ним следует b).

Ссылки

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


Параметр захвата группы

Lookarounds поддерживаются не всемиароматизаторы.Более широко поддерживаются группы захвата.

Вообще говоря, тогда как (a)b все еще соответствует ab, он также захватывает a в группе 1.

Ссылки

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


Опция класса отрицательных символов

В зависимости от необходимости, часто использование отрицательного класса символов намного лучше, чем использование неохотного .*?(в этом случае следует обратить внимание на утверждение шаблона терминатора).

Рассмотрим проблему сопоставления «всего между A и ZZ».Как оказалось, эта спецификация неоднозначна: мы придумаем 3 паттерна, которые это делают, и они приведут к различным совпадениям.Какой из них «правильный», зависит от ожидания, которое неправильно передано в исходном утверждении.

Мы используем следующее в качестве входных данных:

eeAiiZooAuuZZeeeZZfff

Мы используем 3 различных шаблона:

  • A(.*)ZZ дает 1 совпадение: AiiZooAuuZZeeeZZ (, как видно на ideone.com )
    • Это вариант жадный ;группа 1 соответствует и захвачена iiZooAuuZZeee
  • A(.*?)ZZ дает 1 совпадение: AiiZooAuuZZ ( как видно на ideone.com )
    • Это вариант неохотно ;группа 1 соответствует и захвачена iiZooAuu
  • A([^Z]*)ZZ дает 1 совпадение: AuuZZ (, как видно на ideone.com )
    • Это вариант класса с отрицанием ;группа 1 сопоставлена ​​и захвачена uu

Вот наглядное представление того, что они сопоставили:

         ___n
        /   \              n = negated character class
eeAiiZooAuuZZeeeZZfff      r = reluctant
  \_________/r   /         g = greedy
   \____________/g

Ссылки

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

1 голос
/ 13 июля 2010

Хммм, я бы, наверное, сделал это, просто сказав: «Продолжайте, пока не получите нежелательный персонаж», например так:

http://[^'"< >]*

Экранированная версия (на основе Q - не уверен, что это за движок):

http:\/\/[^'\"\< >]*

Однако перспективное решение с использованием полигеномасляных смазок является более гибким способом, если у вас есть некоторые из этих символов в URL (но не в конце).

1 голос
/ 13 июля 2010

Вам нужно использовать «(? = regex )» (lookahead), который ищет конкретный шаблон, но не включает его в результат:

http:\/\/.*?(?=['\"\< >])
...