3

特定の区切り記号のセットに従って文字列を分割しようとしています。
私の区切り文字は次のとおりです: ,"():;.!?単一のスペースまたは複数のスペース。これは私が現在使用しているコードです。

String[] arrayOfWords= inputString.split("[\\s{2,}\\,\"\\(\\)\\:\\;\\.\\!\\?-]+");

ほとんどの場合は問題なく動作しますが、最初の単語が引用符で囲まれていると問題が発生します。例えば

String inputString = "\"Word\" some more text.";

私にこの出力を与えています

arrayOfWords[0] = ""
arrayOfWords[0] = "Word"
arrayOfWords[1] = "some"
arrayOfWords[2] = "more"
arrayOfWords[3] = "text"

出力で配列を取得したい

arrayOfWords[0] = "Word"
arrayOfWords[1] = "some"
arrayOfWords[2] = "more"
arrayOfWords[3] = "text"

このコードは、引用符が文の途中で使用されている場合は正常に機能しています。先頭にある場合は何が問題なのかわかりません。

編集:区切り文字のいずれかが文字列の最初の文字として使用されている場合、同じ問題があることに気付きました

4

2 に答える 2

3

残念ながら、 のみを使用してこの空の最初の要素を削除することはできませんsplit。おそらく、区切り文字に一致する最初の要素を文字列から削除し、その後で分割する必要があります。また、あなたの正規表現は間違っているようです

  • you are in Makingと文字区切り文字の{2,}中に追加することで、[...]{ 2 ,}
  • -残りの区切り文字をエスケープする必要はありません (文字クラスの最後にある[]ため、範囲演算子として使用できないという理由だけでエスケープする必要はないことに注意してください)。

たぶんこの方法を試してください

String regexDelimiters = "[\\s,\"():;.!?\\-]+";
String inputString = "\"Word\"  some more text.";
String[] arrayOfWords = inputString.replaceAll(
        "^" + regexDelimiters,"").split(regexDelimiters);

for (String s : arrayOfWords)
    System.out.println("'" + s + "'");

出力:

'Word'
'some'
'more'
'text'
于 2013-09-15T22:45:01.847 に答える
2

区切り文字は、その両側の文字列を区切るものとして解釈されるため、左側の空の文字列と右側の文字列 ("Word") が結果に追加されます。これを防ぐには、ここで説明するように、最初に先頭の区切り文字を削除する必要があります。

java.lang.String.split() が先頭の空の文字列を作成しないようにするにはどうすればよいですか?

要するに、次のようになります。

String delim = "[\\s,\"():;.!?\\-]+";
String[] arrayOfWords = inputString.replaceFirst("^" + delim, "").split(delim);

編集: Pshemo の答えを見ると、正規表現に関して彼が正しいことがわかります。角かっこの内側では、空白文字の数を指定する必要はありません。空白文字は + 演算子で捕捉されるためです。

于 2013-09-15T22:41:18.330 に答える