正则表达式以樱桃选择位于标签之间的段落的多行组件(非html)

时间:2011-01-30 12:19:08

标签: regex tags

在下文中,我需要一个正则表达式来捕获<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 个答案:

答案 0 :(得分:3)

编辑:正如@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

正则表达式需要以“单行”模式应用(有时称为“dotall”模式)。或者您将.替换为[\s\S]

要在任意两个同名的标记之间一般匹配文字,请使用<(\w+)>代替<(tagstart)>

根据您的正则表达式风格,某些内容可能会有所不同,例如$1代替\1进行反向引用,或者需要额外转义的元字符。

查看Rubular demo

答案 1 :(得分:2)

也许这个正则表达式:(\<tagstart\>)(.+)(\<\/tagstart\>)/s会对你有帮助吗?第二场比赛将是你要搜索的。有关详细信息,请参阅demo

答案 2 :(得分:1)

#!/usr/bin/perl -w

undef $/;

$_ = <>;

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

print $2;

如果您确实只需要<tagstart>,请将<(.*?)><tagstart>之类的内容替换为类似关闭。 undef $/位允许您通过单次读取进行大量的啜食,$2选择第二个匹配组。 s和正则表达式的结尾要求.与新行字符匹配。