Вы можете использовать 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
Ссылки
Смежные вопросы