2012-03-17 17 views
2

非アルファベットをすべてセパレータとして設定して文字列を分割したいと考えています。正規表現のJava分割文字列

String[] word_list = line.split("[^a-zA-Z]"); 

しかし、次の入力と

11時11 Hello Worldの

WORD_LISTは親切にしてください

"hello" を前にして "世界" の多く 空の文字列が含まれています理由を教えてください。ありがとうございました。

+0

'11:11 Hello World'を入力しても結果は期待できますか? – MJM

答えて

2

正規表現がアルファベット以外の文字にそれぞれ一致するためです。これは、カンマで

",,,,,,Hello,World" 

を分離するようになります。

など一度あなたがの非アルファベット文字のシーケンス全体にマッチする表現をしたいだろう:私はまだそれが分離するようになるので、あなたはあなたの例で1つの有数の空の文字列を取得すると思います

line.split("[^a-zA-Z][^a-zA-Z]*") 

",Hello,World"コンマが区切り文字の場合。

+1

'[^ a-zA-Z] +'と同じことです。 – blackcompe

+0

ありがとうblackcompe。私はそれが思ったが、私はいくつかの正規表現の実装を使用していたので、確信が持てなかった。 JavaのString.split()についてはわかりませんでした。 – rayd09

+0

最後に、アルファベット以外の文字を空の文字列に置き換えてから、この正規表現でsplit()を呼び出します。 – Bear

0

次はどうしますか?

String[] word_list = line.replaceAll("[^a-zA-Z ]","").replaceAll(" +", " ").trim().split("[^a-zA-Z]"); 

私はここでやっていることは、分割を行うと、その後、単一のスペースで複数のスペースを交換する前に、すべての非アルファベット文字を削除しています。

2

はここで、各^文字が[^a-zA-Z]の一致を示し、あなたの文字列、です:

11:11 Hello World 
^^^^^^ ^

split方法は、これらの試合のそれぞれを見つけ、基本的に^文字の間のすべての部分文字列を返します。有用なデータの前に6つの一致があるので、文字列"Hello"を得る前に空の部分文字列が5つになります。

これを防ぐには、手動で結果をフィルタリングして空の文字列を無視します。

+0

私はそれが非常にはっきりしているので、説明が好きです。 しかし、私は1つのダニを与えることができます、申し訳ありません。 – Bear

関連する問題