2012-10-09 71 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

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