Java String.replaceAll根据模式追加前缀和后缀

时间:2016-04-28 18:39:42

标签: java regex

我有一个像这样的字符串

DEBUG-172- {com.xyz.testing.test1} - server {logger msg}
DEBUG-122- {com.xyz.testing.test2} - server {logger message}
DEBUG-162- {com.xyz.testing.t1} - server {logger mg}
DEBUG-178- {com.xyz.testing.t2} - server {logger text}

我需要将其转换为这样,

DEBUG-172- <span>{com.xyz.testing.test1}</span> - server {logger msg}
DEBUG-122- <span>{com.xyz.testing.test2}</span> - server {logger message}
DEBUG-162- <span>{com.xyz.testing.t1}</span> - server {logger mg}
DEBUG-178- <span>{com.xyz.testing.t2}</span> - server {logger text}

如何在Java中执行此操作?

我尝试了下面的一个,但它没有用。

data = data.replaceAll("(?<=\\{com)([^\\}]+)(?=\\})", "<span>$1</span>");

它产生的结果如

DEBUG-172- {com<span>.xyz.testing.test1</span>} - server {logger msg}
DEBUG-122- {com<span>.xyz.testing.test2</span>} - server {logger message}
DEBUG-162- {com<span>.xyz.testing.t1</span>} - server {logger mg}
DEBUG-178- {com<span>.xyz.testing.t2</span>} - server {logger text} 

简单地说,我需要在<span>之前添加{com,在相应的</span>之后添加}

2 个答案:

答案 0 :(得分:2)

问题是,环顾四周的机制是zero-length(它们不包含在匹配中,你也可以把它想象成它们在进入环顾之前将光标设置到它的原始位置)。

所以不要使用它。只需让您的论坛以{com开头,然后以}结尾。在两者之间,您可以接受任何不是}的字符(我们不想包含多个})。

此外,您不需要额外的捕获组。默认情况下,整个匹配项存储在组0中,您可以通过$0访问它。

所以你的代码应该更像

data = data.replaceAll("\\{com[^\\}]+\\}", "<span>$0</span>");

答案 1 :(得分:1)

以下可能会做你想要的:

data.replaceAll("\\{com[^}]*\\}", "<span>$0</span>");

还要注意,当嵌套大括号时,它会在脸上掉落。一般来说,用正则表达式无法解决它。