регулярное выражение c # необязательная группа - должны действовать жадные? - PullRequest
2 голосов
/ 07 марта 2011

с регулярным выражением ~ примерно так:

blablabla.+?(?:<a href="(http://.+?)" target="_blank">)?

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

blablabla.+?(?:<a href="(http://.+?)" target="_blank">)

Это будет соответствовать только тем вещам, у которых есть ссылка в конце ... это 2.40 утра ... и у меня нет никаких идей ...

- Edit -

пример ввода:

blablabla asd 1234t535 <a href="http://google.com" target="_blank">

ожидаемый результат:

match 0:

    group 1: <a href="http://google.com" target="_blank">
    group 2: http://google.com`

Я просто хочу "http://google.com" или" "

Ответы [ 3 ]

0 голосов
/ 07 марта 2011

тебе не нужно. +?в начале, регулярное выражение все равно будет искать весь ввод

у вас также есть закрывающее «>» сразу после пробела, что ограничит ваши совпадения

(?:<a href="(http://.+?)" target="_blank".*?>)

тест регулярного выражения

0 голосов
/ 07 марта 2011

Это трейлинг? это делает вас вменяемым. Причина: помечая это как необязательное, вы разрешаете. +? чтобы схватить его.

blablabla.*(?:<a href="((http://)?.*)".+target="_blank".*>)

Я немного его изменил ... .+? в основном совпадает с .*, и если у вас может не быть ничего в вашем href (вы указали, что хотели ""), вам нужно сделать http необязательным, а завершающий текст. Кроме того, .* перед target означает, что у вас есть хотя бы один пробел или символ, но может быть больше (несколько пробелов или других атрибутов). .* перед > означает, что после вас могут остаться пробелы или другие атрибуты.

Это не будет совпадать со строкой, если нет <a href...>, но это то, что вы хотите, верно?

(?: ... ) можно полностью сбросить, если вам не нужно захватывать всю часть <a href...>.

Это не удастся, если атрибуты не перечислены в указанном порядке ... что является одной из причин, по которой регулярное выражение не может быть использовано для анализа html. Но если вы уверены, что href всегда будет стоять перед целью, это должно сделать то, что вам нужно.

0 голосов
/ 07 марта 2011

Вы делаете совпадение всей строки? Если это так, попробуйте добавить .* в конец первого регулярного выражения и посмотрите, что ему подходит. Проблема с первым регулярным выражением состоит в том, что после blablabla он может соответствовать чему угодно из-за .+? (что приводит к пустому захвату), но часть в скобках все равно не будет соответствовать тегу a, если только он не находится в конце строка. Кстати, глядя на ожидаемый результат, захват 1 будет URL; круглые скобки вокруг всего HTML-тега не захватываются из-за ?: в начале.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...