2012-10-09 68 views
0

你能告诉我如何匹配一个由组成的字符串:匹配的自定义标签

  • 一些文字
  • 东西的开头有“小于”后跟任意之间cat, dog, pen <cat>和大于
  • 那么可能会出现一些文字,或者什么也没有,例如<cat> some text
  • 然后关闭相同的标签eg <cat> some text </cat>
  • 通过休耕最终一些文本和其他标记

这样的例子可能是

some text <cat> another text </cat> <dog> </dog> other text <pen> bla bla bla </pen> 
+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>) 
+0

你应该在不确定的中间使'。*'。 –

+0

感谢您的答案,但如果我得到像这样的字符串: foo bla bla bla ,即使它必须失败,您的正则表达式仍然有效。 –

+0

是否有可能不使用回溯? –