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