Скажем, у меня есть тег <tag>
и я хочу сопоставить группы <tag>...<tag>
в моей строке. Я могу использовать регулярное выражение по строкам <tag>.*<tag>
. Это соответствует <tag>foo<tag>
, что хорошо, но оно также соответствует <tag>foo<tag>bar<tag>
, что поведению я не хочу. Я хочу, чтобы <tag>foo<tag>
был сопоставлен, затем следует исключить bar
, а затем тег на конце станет началом следующего матча. Как мне это сделать?Ruby Regular Expression - предотвращает совпадение совпадений
ответ
Самым простым решением является использование ленивого quantifier где ?
вынуждает .*
, чтобы соответствовать как несколько символов, насколько это возможно (и не как много как можно, как неукрашенной .*
будет пытаться соответствовать):
<tag>.*?<tag>
более безопасный, более явное решение заключается в использовании negative lookahead assertion:
<tag>(?:(?!<tag>).)*<tag>
В то время как в данном случае, нет никакой разницы в поведении, то второй из них является расширяемой для обработки открытия/закрытия тегов, убедившись, что вложенные теги не неправильно подобраны:
<tag>(?:(?!</?tag>).)*</tag>
применительно к <tag>foo<tag>bar</tag>baz</tag>
будет совпадение <tag>bar</tag>
, а не <tag>foo<tag>bar</tag>
как решение с ленивым квантором.
Можете ли вы объяснить, что делает его «более безопасным»? – Kvass
Вы можете использовать ленивую версию .*
существ:
<tag>.*?<tag>
^
?
делает .*
матч до до первого матча <tag>
.
- 1. Ruby on rails regular expression
- 2. count ruby regular expression match
- 3. Regular Expression, чтобы найти точное совпадение строки
- 4. Javascript Regular Expression
- 5. Regular Expression (preg_match_all)
- 6. Regular Expression Opposite
- 7. Regular Expression
- 8. Regular Expression
- 9. Regular Expression
- 10. Regular Expression
- 11. Regular Expression
- 12. Php Regular Expression Отладка
- 13. Что такое '? -mix' в Ruby Regular Expression
- 14. Ruby regular expression end of line
- 15. Newb Regular Expression Question - Ruby 1.9.2
- 16. Regular Expression После матча
- 17. Рубин .split() Regular Expression
- 18. .Net Regular Expression Сбои aspnet_wp.exe
- 19. Regular Expression Игнорировать дублирующиеся матчи
- 20. Posix regular expression in C
- 21. Строка Regular Expression
- 22. Regular Expression принять - символ
- 23. PHP Currency Regular Expression
- 24. Regular Expression (preg_match)
- 25. Regular Expression Issue - кот
- 26. Regular Expression Период выпуска
- 27. Regular Expression Java
- 28. Perl Regular Expression
- 29. Tricky Regular Expression
- 30. Perl: Regular Expression Matching
У вас есть HTML-строка? –
Это не обязательно HTML - '' может быть заменено на любую последовательность. –
Kvass
Любая повторяющаяся последовательность будет быстро показывать недостаток использования регулярных выражений, и ваша задача придумать шаблон, который позволяет избежать столкновений/перекрытий, будет ракетой. * ЕСЛИ * вы работаете с HTML или XML, не беспокойтесь о регулярном выражении, если ваши потребности являются чем-то большим, чем наименее тривиальное использование. Вместо этого используйте парсер, например, Nokogiri. Ваш мозг поблагодарит вас позже. –