如何用scala中的\替换字符串中的\\?

时间:2018-01-12 07:30:40

标签: scala typesafe

我正在尝试使用scala中的typesafe配置解析文件。该文件具有要在我的应用程序中作为配置加载的键值对。 关键是正则表达式。 例如:"ASD\\.KL.*\\." = "somevalue"
正则表达式必须加载为"ASD\.KL.*\." 它不适用于类型安全配置工厂,但适用于“属性配置”。 所以我试图替换"ASD\\.KL.*\\.".replaceAll("\\\\","\\"),但这也不起作用。 任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:1)

您应该使用" raw"而不是尝试进行特定的替换。 string来获取相应的Java / Scala字符串,因为它将处理任何原始字符串的" raw" -ness而不仅仅是你的特殊情况。

为commons-lang`添加以下依赖项,

libraryDependencies += "commons-lang" % "commons-lang" % "2.6"

现在,您可以使用StringEscapeUtils

提供的commons-lang
import org.apache.commons.lang.StringEscapeUtils

val rawString = raw"ASD\\.KL.*\\."
// rawString: String = ASD\\.KL.*\\.

val requiredString = StringEscapeUtils.unescapeJava(rawString)
// requiredString: String = ASD\.KL.*\.

答案 1 :(得分:1)

为了匹配文字\字符,您必须使用正则表达式\\,因为\在正则表达式中具有特殊含义,需要进行转义。

为了编写正则表达式\\,您必须使用"\\\\",因为\在Java(和Scala)字符串中具有特殊含义并且需要逃脱。或者,您可以将raw"\\"用于相同的正则表达式。

为了匹配两个连续的\\,您必须使用"\\\\\\\\"作为字符串(或raw"\\\\")。

字符\replaceAll的替换部分中也有特殊含义,并且需要根据JavaDoc进行转义

  

请注意,替换字符串中的反斜杠()和美元符号($)可能会导致结果与将其视为文字替换字符串时的结果不同;见Matcher.replaceAll。如果需要,使用Matcher.quoteReplacement(java.lang.String)来抑制这些字符的特殊含义。

这就是它最终的样子

scala> import java.util.regex.Matcher
import java.util.regex.Matcher

scala> val s = raw"ASD\\.KL.*\\."
s: String = ASD\\.KL.*\\.

scala> s.replaceAll(raw"\\\\", Matcher.quoteReplacement(raw"\"))
res0: String = ASD\.KL.*\.

scala> s.replaceAll("\\\\\\\\", Matcher.quoteReplacement("\\"))
res1: String = ASD\.KL.*\.

答案 2 :(得分:0)

试试这个

"ASD\\.KL.*\\.".replace("\\", "/"); 

<强>

var tmp = "ASD\\.KL.*\\."; 
tmp.replace("\\", "/");