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 に答える
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 に答える