私はいくつかの文字列を持っています。例えば: 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/"/./