正则表达式:将“ @@”替换为“ @”,并将“ @”替换为某些字符串

问题描述

问题: 我是regex的新手,我有字符串
"this @ is @@ sample @@@ string @@@@" 并具有目标字符串"xxx"
就是这样,
'@'替换为"xxx"(目标字符串)
'@@'替换为'@'

所以输出看起来像这样,
this xxx is @ sample @xxx string @@


* 我尝试过的操作(scala)

"this @ is @@ sample @@@ string @@@@".replaceAll("@@","\u0000").replaceAll("@","xxx").replaceAll("\u0000","@")

但是问题是,如果源字符串包含\u0000,它将被@替换

因此,涉及到正则表达式是否可以选择不连续两次的@,因此对于"this @ is @@ sample @@@ string @@@@",我们将仅用不连续两次的目标字符串代替,例如

“此@是@@示例@@ @字符串@@@@” (匹配的两个结果将替换为目标字符串xxx
而不是简单地.replaceAll("@@","@")

解决方法

您可以使用

val text = "this @ is @@ sample @@@ string @@@@"
val regex = "@@?".r
println(regex.replaceAllIn(text,m => if (m.group(0).length == 1) "xxx" else "@"))

看到Scala demo,输出:

this xxx is @ sample @xxx string @@

@@?模式匹配一​​个或两个@字符。如果匹配值的长度为1,则替换为xxx,否则为@

,

不需要正则表达式。 (至少没有明显的正则表达式用法。)

"this @ is @@ sample @@@ string @@@@"
  .split("@@",-1)
  .map(_.replaceAll("@","xxx"))
  .mkString("@")
//res0: String = this xxx is @ sample @xxx string @@