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



假设我有一个包含静态标签的字符串,如下所示:

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])", "");

但是,我觉得这会绕过这个问题,因为我并没有真正捕获完整的标签。

谁能为我提供解决这个问题的方法? 谢谢!

我想我已经知道了。

我对@AshishMathew说的话想了很久,是的,回头看不可能有不固定的长度,但也许我们不是用什么都没有替换它,而是添加一个],如下所示:

mystring = mystring.replaceAll("(?<=\[tag)(.*?)(?=\[/tag])", "]");

(?<=\[tag)是与[tag相匹配的后视

(.*?)[tag[/tag] 之间的所有代码,甚至可能是标签的参数,所有这些都被替换为]

当我通过将匹配替换为 "" 来尝试此代码时,我得到了[tag[/tag] untagged text [tag[/tag]作为输出。因此,通过将匹配替换为]而不是什么都没有,您可以获得(希望(所需的输出。

所以这是我对这个问题的懒惰解决方案(请原谅正则表达式双关语(。

我建议将整个标签与内容匹配,并替换为没有内容的开始/结束标签:

mystring.replaceAll("\[tag[^\]]*\][^\[]*\[/tag]", "[tag][/tag]")

Ideone测试。

请注意,我没有费心保留标签属性,因为您在另一个答案的评论中提到您不需要它们,但可以使用捕获组来保留它们。

最新更新