2012-07-01 13 views
19

以下は私のREPL出力です。なぜstring.splitがここで動作しないのか分かりません。scala string.splitが機能しません

val s = "Pedro|groceries|apple|1.42" 
s: java.lang.String = Pedro|groceries|apple|1.42 

scala> s.split("|") 
res27: Array[java.lang.String] = Array("", P, e, d, r, o, |, g, r, o, c, e, r, i, e, s, |, a, p, p, l, e, |, 1, ., 4, 2) 

答えて

56

引用符を使用する場合は、正規表現分割を要求しています。 |は "or"文字なので、正規表現は何も一致しません。だからすべてが分かれている。

split('|')またはsplit("""\|""")を使用する場合は、必要なものを取得する必要があります。

+0

いいです。スカラーでは、 "と"の違いは何ですか? – riship89

+2

"" "stuff" "" 'はリテラル文字列を引用します。 '' stuff ''はエスケープ文字を解釈します。バックスラッシュはJava文字列_and_ regexesのエスケープ文字_both_なので、エスケープ文字をエスケープして正規表現に入れる必要があります: '\\ |" '。これはすぐに混乱するので、トリプルクォートを使用してリテラル文字列を探してください。 –

+0

... "somestring"と同じ "" "somestring" ""と同じですか? – riship89

3

Splitは最初の引数として正規表現を取るため、呼び出しは "空文字列か空文字列"と解釈されます。予想される動作を得るには、パイプ文字 "\\ |"をエスケープする必要があります。

5

|OR操作のための論理演算子として使用される特殊な正規表現文字です。 java.lang.String#split(String regex);が正規表現になりますので

、あなたはどれは、基本的にすべての単一の文字の間で」がないことを意味し、全体が正規表現の分割については、別の専門である「なしまたはNone」、文字列を分割しています"

あなたが望むものを得るためには、正規表現パターンを適切にエスケープする必要があります。パターンをエスケープするには、\という文字を前に付ける必要があります。は特殊なString文字(たとえば、\t\rと考えるので)を実際にダブルエスケープすると、s.split("\\|")になります。

完全なJava正規表現の構文については、java.util.regex.Pattern javadocを参照してください。

関連する問題