3

可以无缝吗?

 scala> val p = "$"
 scala> "hello, I have 65 dollars".replaceFirst("dollars", p)

目前的结果是

 java.lang.StringIndexOutOfBoundsException: String index out of range: 1
 ....

scala 2.10 中的预期结果:

 hello, I have 65 $

问题在于p存储符号的变量$,我需要将其作为字符串处理而不是正则表达式。

注意: 我不能修改(例如替换所有非字母符号)p 变量(仅限标准函数,例如 .toString)

注意2:给定的示例是玩具示例。我会很感激一个更通用的解决方案。即变量p可以包含任何类型的内容(符号、数字、文本……),因此将“$”替换为“\\$”没有多大意义

(这是类似问题的改进版本:scala string, raw string

4

3 回答 3

2

您需要转义美元符号文字,因为Java 在其正则表达式的实现中使用它作为组引用

您注意到您无法修改 p 变量中的字符串文字,因此您需要求助于替换美元符号和其他特殊字符,如下所示

Pattern.quote(p);
于 2013-04-09T10:15:10.640 回答
2

用于Regex.quote模式和quoteReplacement替换字符串。(这些只是调用Pattern。)

scala> import util.matching._
import util.matching._

scala> "hello, I have 65 dollars".replaceFirst("dollars", Regex quoteReplacement p)
res7: String = hello, I have 65 $

scala> "dollars".r replaceFirstIn ("hello, I have 65 dollars", Regex quoteReplacement p)
res8: String = hello, I have 65 $

scala> "hello, I have 65 dollars".replaceAllLiterally("dollars", p) // quotes both
res9: String = hello, I have 65 $
于 2014-04-25T12:11:46.737 回答
1

问题是 replaceFirst() 使用正则表达式,所以:

"65 dollars".replaceFirst("dollars","$0") // compiles
"65 dollars".replaceFirst("dollars","$")  // throws "StringIndexOutOfBoundsException"

如果,

val dollars = "$"

您可以转义 $ 符号,

"65 dollars".replaceFirst( "dollars", if(dollars == "$") "\\$" else dollars )

或使用字符串插值,

s"65 $dollars"

或者去老式的字符串操作,

val t = "65 dollars".split("dollars"); if(t.size>1) t.mkString(dollars) else t(0) + dollars

或者用地图,

val ff = "dollars"
val r1 = "$"
"65 dollars, 3 dollars, 50 dollars".split(ff).zipWithIndex.map{case (t,0) => t+r1; case (t,_) => t+ff}.mkString
于 2013-04-09T12:59:39.000 回答