Regex Нежадный (ленивый)

Я пытаюсь не жадно разобрать теги TD. Я начинаю с чего-то вроде этого:

<TD>stuff<TD align="right">More stuff<TD align="right>Other stuff<TD>things<TD>more things

Я использую ниже как мое регулярное выражение:

Regex.Split(tempS, @"\<TD[.\s]*?\>");

Записи возвращаются, как показано ниже:

""
"stuff<TD align="right">More stuff<TD align="right>Other stuff"
"things"
"more things"

Почему он не разделяет этот первый полный результат (тот, который начинается с «stuff»)? Как настроить регулярное выражение для разделения на все экземпляры тега TD с параметрами или без них?


person steventnorris    schedule 12.12.2012    source источник
comment
См. stackoverflow.com/questions/1732348/   -  person Brian Rasmussen    schedule 12.12.2012
comment
. просто означает буквальную точку в классе символов [.], а не «любой символ». Вы можете добиться большего успеха с [^>]*, но это сломает > в атрибуте (что является одной из причин, почему мы часто смотрим на синтаксические анализаторы, а не на регулярные выражения для манипулирования html и xml).   -  person Wrikken    schedule 12.12.2012
comment
@Wrikken HTML здесь довольно статичен. Существует не так много вариантов, и я знаю регулярное выражение, которое для этого подойдет. Я не пошел по пути парсеров из-за этого. Есть ли способ сделать . символ означает «любой символ», включая пробел?   -  person steventnorris    schedule 12.12.2012
comment
Я не знаю модификаторов С# (в pcre это будет /s), чтобы точка соответствовала всем. Однако [^>]*> функционально эквивалентен (.|\s)*?> и, вероятно, проще в регулярном выражении.   -  person Wrikken    schedule 12.12.2012


Ответы (3)


Вам нужно регулярное выражение <TD[^>]*>:

<     # Match opening tag
TD    # Followed by TD
[^>]* # Followed by anything not a > (zero or more)
>     # Closing tag

Примечание: . соответствует чему угодно (включая пробелы), поэтому [.\s]*? является избыточным и неправильным, поскольку [.] соответствует буквальному ., поэтому используйте .*?.

person Chris Seymour    schedule 12.12.2012
comment
По умолчанию, . не соответствует новой строке, но \s соответствует. - person Tommi Gustafsson; 05.06.2014

Для нежадного поиска попробуйте это <TD.*?>

person Jason    schedule 12.12.2012
comment
@Hambone Потому что ? после квантификатора * говорит механизму регулярных выражений прекратить употребление символов, когда он находит первое совпадение выражения, следующего за ?, то есть - >. Разница в том, что жадный и не жадный *. - person JustAMartin; 14.04.2016

Из https://regex101.com/

  • * Квантификатор — Соответствует от нуля до неограниченного количества раз, как можно больше раз, возвращая по мере необходимости (жадный)
  • *? Квантификатор — Соответствует от нуля до неограниченного количества раз, как можно меньшее количество раз, расширяясь по мере необходимости (ленивый)
person Bastien Vandamme    schedule 11.06.2018