Регулярное выражение для вишни выбрать многострочный компонент абзаца, расположенный между тегами (не html) - PullRequest
1 голос
/ 30 января 2011

В следующем мне понадобится Regexpr для захвата части между <tagstart></tagstart>

Обратите внимание, это не html

* real time results: shows results as you type 
* code hinting: roll over your expression to see info on specific elements 
* detailed results: roll over a match to see details & view group info below 
* built in regex guide: doub<tagstart>le click entries to insert them into your expression 
* online & desktop: regexr.com or download the desktop version for Mac, Windows, or Linux 
* save your expressions: My Saved expr</tagstart>essions are saved locally 
* search Community expressions and add your own

Спасибо

Ответы [ 3 ]

3 голосов
/ 30 января 2011

РЕДАКТИРОВАТЬ: Как правильно отмечает @Kobi в комментариях, гораздо более простая версия оригинального сообщения ниже, конечно:

<(tagstart)>(.*?)</\1>

Поскольку оригинальная версия также работает, а все остальные утверждения остаются верными, я оставлю все как есть.


Если ( и только если ) теги не могут быть вложенными:

<(tagstart)>((?:(?!</\1>).)*)</\1>

Пояснение:

<(tagstart)>      # matches "<tagstart>" and stores "tagstart" in group 1
(                 # begin group 2
  (?:             #   begin non-capturing group
    (?!           #     begin negative look-ahead (... not followed by)
      </\1>       #       a closing tag with the same name as group 1
    )             #     end negative look-ahead
    .             #     if ok, match the next character
  )*              #   end non-capturing group, repeat
)                 # end group 2 (stores everything between the tags)
</\1>             # a closing tag with the same name as group 1

Регулярное выражение необходимо применять в режиме «одной строки» (иногда его называют режимом «точка»). Либо это, либо вы заменяете . на [\s\S].

Для общего сопоставления текста между любыми двумя тегами с одинаковыми именами используйте <(\w+)> вместо <(tagstart)>.

В зависимости от вашего вкуса регулярных выражений некоторые вещи могут работать по-разному, например $1 вместо \1 для обратных ссылок или метасимволы, которые требуют дополнительного экранирования.

См. Rubular demo .

2 голосов
/ 30 января 2011

Может быть, это регулярное выражение: (\<tagstart\>)(.+)(\<\/tagstart\>)/s поможет вам?Второй матч будет то, что вы ищете.Подробнее см. демо .

1 голос
/ 30 января 2011
#!/usr/bin/perl -w

undef $/;

$_ = <>;

m|<(.*?)>(.*)</\1>|s;

print $2;

Если вам действительно нужно просто <tagstart>, замените биты вроде <(.*?)> на <tagstart> и аналогичные для закрытия. Бит undef $/ позволяет много выпить за одно чтение, а $2 выбирает вторую группу совпадений. s и конец регулярного выражения запрашивают ., чтобы соответствовать даже символам новой строки.

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