2016-05-04 3 views
1

私はこの問題を解決するための正確な方法を見つけることができません。 スペースがあり、句読点を付けることができる文章を分割したいと思います。私は、単語と句読点を保持し、それらを単一の配列に格納したい。Java:デリミタを分割して保持する方法

Example sentence; 
We have not met, have we? 

Desired array; 
{"We", "have", "not", "met", ",", "have", "we", "?"} 

私は1つの文字列分割方法で文を分割しようとしています。 スタックオーバーフローに関する他の関連する質問を見てきました。私は特に疑問符のために私を代償する正規表現を得ることができません。

+2

http://stackoverflow.com/questions/2206378/how-to-split-a-string-but-also-keep-the-delimiters – Reimeus

+1

@Alex Conroy誰かが同様の質問をしたかどうか試してみてください最初。上記のようにこれをカバーするものはいくつかあります。http://stackoverflow.com/questions/3777546/how-can-i-split-a-string-in-java-and-retain-the-delimiters – Tibrogargan

+0

ありがとうリンク@Tibrogarganのために、私は実際に手でその質問を見上げたが、それは私のために働かなかった。私はその質問から解決策を微調整し、それは疑問符のために期待されるすべてで働いた、私は疑問符のためのエラーメッセージを受け取っていた。 –

答えて

1

あなたは空白または非単語の文字の前の位置で分割を試みることがあります。\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を参照してください。

+1

シンプルなソリューションをありがとうとありがとう、ありがとう。 また、正規表現デモリンクのための歓声は、人生の節約になるでしょう。 –

0
String sentence="We have not met, have we ?"; 
String[] splited = sentence.split("\\s+"); 
+1

これはスペースだけを分割し、分割して感嘆符を付けることはありません。 –

+0

あなたはこれが何をし、どのようにOPに取り組んでいるのかを考えてください。 –

関連する問題