假设我有一个包含静态标记的String,如下所示:
mystring = "[tag]some text[/tag] untagged text [tag]some more text[/tag]"
我想删除每个标记对之间的所有内容。我已经弄清楚如何使用以下正则表达式:
mystring = mystring.replaceAll("(?<=\\[tag])(.*?)(?=\\[/tag])", "");
结果将是:
mystring = "[tag][/tag] untagged text [tag][/tag]"
但是,如果开始标记是动态的,我不确定如何实现相同的目标。例如:
mystring = "[tag parameter="123"]some text[/tag] untagged text [tag parameter="456"]some more text[/tag]"
标签的parameter
部分的“值”是动态的。不知何故,我必须在我目前的正则表达式中引入通配符,但我不确定如何做到这一点。
基本上,用空字符串替换"[tag*]"
和"[/tag]"
所有配对的内容。
一个明显的解决方案是做这样的事情:
mystring = mystring.replaceAll("(?<=\\[tag)(.*?)(?=\\[/tag])", "");
然而,我觉得这会解决这个问题,因为我并没有抓住一个完整的标签。
有人能为我提供这个问题的解决方案吗?谢谢!
答案 0 :(得分:2)
我想我已经得到了它。
我认为@AshishMathew所说的很长很难,是的,看后面的人不会有不固定的长度,但也许不用任何东西替换它,我们就为它添加一个]
,就像这样:
mystring = mystring.replaceAll("(?<=\\[tag)(.*?)(?=\\[/tag])", "]");
(?<=\\[tag)
是与[tag
(.*?)
是[tag
和[/tag]
之间的所有代码,甚至可能是代码的参数,所有代码都被]
当我通过将匹配替换为""
来尝试此代码时,我得到[tag[/tag] untagged text [tag[/tag]
作为输出。因此,通过用]
而不是任何内容替换匹配,您可以获得(希望)所需的输出。
所以这是我的 lazy 解决方案(原谅正则表达式双关语)。
答案 1 :(得分:1)
我建议将整个标记与内容匹配,并替换为没有内容的开始/结束标记:
mystring.replaceAll("\\[tag[^\\]]*\\][^\\[]*\\[/tag]", "[tag][/tag]")
请注意,由于您在另一个答案的评论中提到您并不需要它们,因此我没有考虑保留标记属性,但可以通过使用捕获组来保留它们。