0

私は今日Java正規表現の学習を始めたばかりなので、正規表現の何が問題なのかを学ぶのにかなり怠惰なアプローチを取ったことをお許しください。基本的に、「空白」、-、「空白」パターン (空白は 1 つまたはなし) で文字列を分割しようとしていますが、パターンがコンパイルされない理由がわかりません。[^(\s?-\s?)] (インデックス 8) の 2 番目の s でエラーが発生します。誰かが私を助けてくれたら、本当に感謝します!

4

2 に答える 2

3

分割しようとしているパターンを、期待していることとは正反対のことをしている否定された文字クラス内に配置しています。

[^(\s?-\s?)]  # matches any character except: 

                  # '('
                  # whitespace (\n, \r, \t, \f, and " ") 
                  # '?'
                  # '-'
                  # whitespace (\n, \r, \t, \f, and " ")
                  # '?'
                  # ')'

あなたの構文は確かに正しくありませんがwhy will it not compile?、文字クラス内ではハイフンには特別な意味があります。クラスの最初または最後の文字としてハイフンを配置できます。一部の正規表現の実装では、範囲の直後に配置することもできます。ハイフンを他の場所に配置する場合は、クラスに追加するためにエスケープする必要があります。

コンパイルの問題を修正するには、単にハイフンをエスケープしますが、それでもこの正規表現はあなたが望むことをしません。

空白、-空白パターンで文字列を分割しようとしています...

文字クラスとキャプチャ グループをパターンから削除します。

String s = "foo - bar - baz-quz";
String[] parts = s.split("\\s?-\\s?");
System.out.println(Arrays.toString(parts)); //=> [foo, bar, baz, quz]

正規表現を学習するためのリファレンスをいくつか紹介します。

于 2014-08-04T01:37:35.190 に答える
0

\s は文字クラスです。[] 内の文字はそれらの文字として扱われます。(または [^] の場合は特定の文字ではありません)。[] 内で \s を使用しても意味がありません。

おそらく、中括弧の代わりに括弧を使用するつもりですか?

于 2014-08-04T01:13:31.360 に答える