あなたは空白または非単語の文字の前の位置で分割を試みることがあります。\s+|(?=\W)
は|
記号で分離された二つの選択肢が含まれています
\s+|(?=\W)
はregex demo
パターンがの詳細を参照してください。 。 \s+
は、分割時に削除される1つ以上の空白と一致します。 (?=\W)
は、その中に含まれるパターンの前の空白にのみ一致する肯定的な先読みです。ここでは、\W
は、単語でない文字(文字、数字、またはアンダースコアではありません)と一致します。
注:非単語\W
クラスがあなたのためにあまりにも「貪欲」である場合は、あなただけの句読点の前に分割する句読点クラス、\p{P}
(String pattern = "\\s+|(?=\\p{P})"
)を使用することができます。
IDEONE Java demo:
:
String str = "We have not met, have we?";
String[] chunks = str.split("\\s+|(?=\\W)");
System.out.println(Arrays.toString(chunks));
// => [We, have, not, met, ,, have, we, ?]
あなたは、全体の単位として非空白/非単語のチャンクをトークン化する必要がある場合は(たとえば、?!!
一つとして配列要素)、このマッチング技術を使用して
Pattern ptrn = Pattern.compile("[^\\s\\W]+|\\S+");
Matcher m = ptrn.matcher("We have not met, have we?!!");
List<String> list = new ArrayList<>();
while (m.find()) {
list.add(m.group(0));
}
System.out.println(list); // => [We, have, not, met, ,, have, we, ?!!]
another IDEONE demoおよびa regex demoを参照してください。
http://stackoverflow.com/questions/2206378/how-to-split-a-string-but-also-keep-the-delimiters – Reimeus
@Alex Conroy誰かが同様の質問をしたかどうか試してみてください最初。上記のようにこれをカバーするものはいくつかあります。http://stackoverflow.com/questions/3777546/how-can-i-split-a-string-in-java-and-retain-the-delimiters – Tibrogargan
ありがとうリンク@Tibrogarganのために、私は実際に手でその質問を見上げたが、それは私のために働かなかった。私はその質問から解決策を微調整し、それは疑問符のために期待されるすべてで働いた、私は疑問符のためのエラーメッセージを受け取っていた。 –