2010-07-04 2 views
2

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

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

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

+1

Обратите внимание, что атрибуты HTML могут содержать простые символы '>'. Ваше регулярное выражение не учитывает это. – Gumbo

+0

Я следовал за учебником, который (как вы указываете) использует простой подход к проблеме.Меня больше интересовал способ *? работает. –

+0

См. Также http://stackoverflow.com/questions/3075130/difference-between-and-for-regex/3075532#3075532 - Я подробно рассмотрел это с помощью иллюстративных примеров. – polygenelubricants

ответ

8

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

1* - подходит как можно больше 1 s.
1*? - матч как можно меньше 1 s.

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

Смотрите также: Laziness Instead of Greediness

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

0

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

6

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

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

в

 
This . 

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

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

становится:

 
This is an example. 

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

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

+0

+1 Мне нравятся ваши примеры. – alex

0

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

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

Надежда, что помогает!