/ /文字列を分割し、句読点と空白で区切る - java、regex、split

文字列を分割し、句読点と空白で区切る - java、regex、split

私はいくつかの文字列を持っています。例えば: I: am a string, with "punctuation". 私はそのような文字列を分割したい:

["I", ":", "am", "a", "string", ",", "with", """, "punctuation", """, "."]

私は試した text.split("[\p{Punct}\s]+") 結果は I, am, a, string, with, punctuation ...

私は見つけた この 解決策はありますが、Javaでは分割できません w .

回答:

回答№1は6

この正規表現を使用してください:

"\s+|(?=\p{Punct})|(?<=\p{Punct})"

あなたの文字列の結果:

["I", ":", "am", "a", "string", ",", "with", "", """, "punctuation", """, "."]

残念ながら、余分な要素があります。 "" の後に。これらの余分な要素は、空白文字の後に句読点がある場合にのみ発生します(常に発生します)。 myString.replaceAll("\s+(?=\p{Punct})", "").split(regex); の代わりに myString.split(regex); (すなわち、分割する前に空白を除去する)

この仕組み:

  • \s+ 空白のグループを分割するので、空白文字の場合はその文字を削除し、その場所で分割します。 (注:私は、 hello world 結果は ["hello", "world"] のではなく、 ["hello", "", "world"]
  • (?=\p{Punct}) 次の文字が区切り文字であれば分割する先読みですが、文字を削除しません。
  • (?<=\p{Punct}) 最後の文字が区切り文字の場合は分割されます。

編集:

に応答して あなたのコメントこの正規表現では、単語内の句読点を許可する必要があります。

"\s+|(?=\W\p{Punct}|\p{Punct}\W)|(?<=\W\p{Punct}|\p{Punct}\W})"

このためには、 replaceAll、簡単に myString.split(regex).

使い方:

この正規表現は非常によく似ていますが、ルックアバウトは変更されました。 \W\p{Punct} 単語以外の文字とそれに続く句読点が一致します。 \p{Punct}\W 句読点とそれに続く単語以外の文字が一致します。したがって、それぞれのルックアングルは、単語の途中にない句読点文字がある場合に一致します。


回答№2の場合は0

または、これを試して、ArrayListで収集してください:

    String s = "I: am a string, with "punctuation".";
Pattern pat = Pattern.compile( "\w+|\S" );

Matcher mat = pat.matcher( s );
while( mat.find() ){
System.out.print( mat.group() +  "/" );
}
System.out.println();

出力:

 I/:/am/a/string/,/with/"/punctuation/"/./