你能告诉我如何匹配由以下字符组成的字符串:
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>
答案 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>)