假设我有一个包含静态标签的字符串,如下所示:
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测试。
请注意,我没有费心保留标签属性,因为您在另一个答案的评论中提到您不需要它们,但可以使用捕获组来保留它们。