Scala搜索和替换使用替换不给出预期的结果

时间:2017-09-17 23:10:39

标签: string scala replace

下面的替换功能不是我所期望的。什么是从头到尾搜索/匹配精确字符串并替换的最佳方式。 怎么做到这一点?

提前致谢。

val valSet = Seq("BELL","BELL.*")

scala> var str = "(((( EMP = BELL) OR ( LASTNAME = BELL) OR ( LASTNAME = BELL)) OR ( ( EMPFIRSTNAME = BELL.*)))"

scala> valSet.map { x=> str= str.replace(x , """""""+x+""""""") }

scala> str
res1: String = (((( EMP = "BELL") OR ( LASTNAME = "BELL") OR ( LASTNAME = "BELL")) OR ( ( EMPFIRSTNAME = "BELL".*)))

预期输出为:

(((( EMP = "BELL") OR ( LASTNAME = "BELL") OR ( LASTNAME = "BELL")) OR ( ( EMPFIRSTNAME = "BELL.*")))

1 个答案:

答案 0 :(得分:0)

在这种情况下,人们想要搜索并替换精确字符串,其中一个字符串是另一个字符串的子字符串(BELL是BELL的前缀。*),否则将使用的方法(str.replace) )并不总是能够工作(如果没有字符串是另一个字符串的替换字符串的子字符串,可以通过执行搜索并以正确的顺序替换它来使其工作)。

然而,人们可以用正则表达式做到这一点:

val str = "(((( EMP = BELL) OR ( LASTNAME = BELL) OR ( LASTNAME = BELL)) OR ( ( EMPFIRSTNAME = BELL.*)))"
val regex = "BELL((\\.)(\\*))?"
val replaced = str.replaceAll(regex, "\"BELL$2\"")

如果你想阻止已被引用的“BELL”,例如

val str = """(((( EMP = "BELL") OR ( LASTNAME = BELL) OR ( LASTNAME = BELL)) OR ( ( EMPFIRSTNAME = BELL.*)))"""

然后正则表达式和替换成为:

val regex = """([^"])BELL((\\.)(\\*))?([^"])"""
val replaced = str.replaceAll(regex, """$1"BELL$2"$5""")

(虽然请注意这种方法有点脆弱:如果你想处理引号并确保它们得到适当的平衡等等,你基本上不在正则表达式的范围之内并进入无上下文领域语法...)