Я не понимаю регулярное выражение - PullRequest
2 голосов
/ 04 июля 2010

Я слежу за учебником (Ruby), который использует регулярные выражения для удаления всех тегов html из строки:

product.description.gsub(/<.*?>/,'').

Я не знаю, как интерпретировать?.Означает ли это: «хотя бы один из предыдущих»?В таком случае, /<.+>/ не было бы более адекватным?

Ответы [ 4 ]

8 голосов
/ 04 июля 2010

В этом случае * ленивый.

1* - соответствует максимально возможному количеству 1 с.
1*? - сопоставить как можно меньше 1 с.

Здесь, когда у вас есть <a>text<b>some more text, <.*> будет соответствовать <a>text<b>.
Однако <.*?> будет соответствовать <a> и <b>.

Смотри также: Лень вместо жадности

Еще одно важное замечание: в этом регулярном выражении может легко произойти сбой в действительном HTML, лучше использовать анализатор HTML и получить текст документа.

6 голосов
/ 04 июля 2010

По умолчанию .* является жадным , что означает, что оно максимально соответствует.Таким образом, с .* замена изменится:

This <b>is</b> an <i>example</i>.
     ^-------------------------^

на

This .

Если вы используете вопросительный знак после квантификатора, это делает его нежаднымтак, чтобы оно совпадало как можно меньше.С .*? замена работает следующим образом:

This <b>is</b> an <i>example</i>.
     ^-^  ^--^    ^-^       ^--^

Становится:

This is an example.

Это отличается от более распространенного использования ? в качестве квантификатора, где это означает «совпадение»ноль или единица '.

В любом случае, если ваш текст HTML, вы должны использовать анализатор HTML вместо регулярных выражений.

0 голосов
/ 04 июля 2010

это лучший сайт, который я нашел о регулярных выражениях после библиотеки регулярных выражений:

http://www.wellho.net/regex/java.html

Надеюсь, это поможет!

0 голосов
/ 04 июля 2010

Квантификаторы, такие как *, по умолчанию жадные.Это означает, что они совпадают как можно больше.Добавление ? после них делает их ленивыми, чтобы они прекратили сопоставление как можно скорее.

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