0

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

  • 一些文字
  • 以“小于”开头的东西,然后是任何中间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>
4

1 回答 1

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>)
于 2012-10-09T22:38:46.047 回答