Java正则表达式:替换动态子字符串

时间:2018-03-21 15:37:57

标签: java regex

假设我有一个包含静态标记的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])", "");

然而,我觉得这会解决这个问题,因为我并没有抓住一个完整的标签。

有人能为我提供这个问题的解决方案吗?谢谢!

2 个答案:

答案 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]")

Ideone test

请注意,由于您在另一个答案的评论中提到您并不需​​要它们,因此我没有考虑保留标记属性,但可以通过使用捕获组来保留它们。