Регулярное выражение для соответствия выражению, за которым следует символ нижнего регистра

Я хочу сопоставить закрывающий тег, за которым следует 0+ пробелов/новой строки, за которым следует открывающий тег, за которым следует строчная буква. Примеры:

  • text</p> <p>blah соответствует </p> <p>
  • text</i><i>and more text <b>but not this</b> соответствует </i><i>
  • text</i> <i>And more text не соответствует

Я попробовал это: </.*?>\s*\n*\s*<.*>(?=[a-z]), но это не работает для второго примера, так как оно будет соответствовать </i><i> and more text </b>, хотя вопросительный знак должен сделать его "ленивым".


person Zout    schedule 01.03.2014    source источник
comment
Почему бы вместо этого не использовать парсер HTML? Регулярные выражения — это не инструмент для работы с HTML; это приведет к боли и мучениям..   -  person Martijn Pieters    schedule 01.03.2014


Ответы (2)


Пытаться:

</[^>]+>\s*<[^/>]+>(?=[a-z])

Измените «+» на «*», если вы хотите иметь возможность сопоставлять пустые теги

person Ron Rosenfeld    schedule 01.03.2014

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

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

</[^<>]*>\s*<[^/][^<>]*>(?=[a-z])

(Кроме того, \s уже содержит \n, поэтому \s*\n*\s* можно сократить до \s*)

person Tim Pietzcker    schedule 01.03.2014