匹配自定义标记

时间:2012-10-09 22:35:24

标签: regex

你能告诉我如何匹配由以下字符组成的字符串:

  • 一些文字
  • 以“小于”开头的内容,后跟cat, dog, pen <cat>
  • 之间的任何内容
  • 然后可能会出现一些文字,或者什么都没有,例如<cat> some text
  • 然后关闭相同的标签,例如<cat> some text </cat>
  • 最终被一些文字和其他标签所迷惑

所以一个例子可能是

some text <cat> another text </cat> <dog> </dog> other text <pen> bla bla bla </pen>

1 个答案:

答案 0 :(得分:1)

你需要回溯。根据您正在使用的正则表达式的类型,这样的东西可能会起作用:

<(cat|dog|pen)>.*<\/\1>

以上内容适用于Perl。但是,YMMV取决于您使用的工具。例如,在sed中,以下内容可行:

<\(cat\|dog\|pen\)>.*<\/\1>

正如评论中所述,中间的.*不应该贪婪,否则它只会匹配<dog>blah</dog> <dog>foo</dog>一次。究竟如何做取决于正则表达式引擎。

在一个简单的例子中,您不允许之间的任何标记:

<(cat|dog|pen)>[^<>]*<\/\1>

或者,在Perl中,你可以使正则表达式非贪婪:

<(cat|dog|pen)>.*?<\/\1>

或者你可以在没有回溯的情况下做到这一点,但那就是步法:

 (<cat>.*?<\/cat>|<dog>.*?<\/dog>|<pen>.*?<\/pen>)