问题描述
问题:
我是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 @@