下面的替换功能不是我所期望的。什么是从头到尾搜索/匹配精确字符串并替换的最佳方式。 怎么做到这一点?
提前致谢。
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.*")))
答案 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""")
(虽然请注意这种方法有点脆弱:如果你想处理引号并确保它们得到适当的平衡等等,你基本上不在正则表达式的范围之内并进入无上下文领域语法...)