web-dev-qa-db-ja.com

javaの句読点や空白などによる正規表現による文字列の分割

このテキストファイルをJavaアプリケーションに読み込んでから、その行の単語を1行ずつカウントします。現在、行を単語ごとに

String.split([\\p{Punct}\\s+])"

しかし、テキストファイルからいくつかの単語を見逃していることは知っています。たとえば、「ca n't」という単語は、「can」と「t」という2つの単語に分ける必要があります。

カンマやその他の句読点は完全に無視し、空白と見なす必要があります。これを行うために、より正確な正規表現を作成する方法を理解しようとしましたが、これに関しては初心者なので、助けが必要です。

私が説明した目的のためのより良い正規表現は何でしょうか?

22
Snorkelfarsan

正規表現に小さな間違いが1つあります。これを試して:

String[] Res = Text.split("[\\p{Punct}\\s]+");

[\\p{Punct}\\s]+を移動+は、文字クラスの内側から外側へ。それ以外の場合は、+および分割文字を連続して組み合わせないでください。

だから私はこのコードを手に入れる

String Text = "But I know. For example, the Word \"can\'t\" should";

String[] Res = Text.split("[\\p{Punct}\\s]+");
System.out.println(Res.length);
for (String s:Res){
    System.out.println(s);
}

この結果

10
だが

知っている
にとって



できる
t

あなたの要件を満たす必要があります。

代わりに使用できます

String[] Res = Text.split("\\P{L}+");

\\P{L}は、プロパティ「Letter」を持つUnicodeコードポイントではないことを意味します

21
stema

非Wordリテラル\Wがあります。 Pattern を参照してください。

String line = "Hello! this is a line. It can't be hard to split into \"words\", can it?";
String[] words = line.split("\\W+");
for (String Word : words) System.out.println(Word);

与える

Hello
this
is
a
line
It
can
t
be
hard
to
split
into
words
can
it
10
Qwerky

まあ、あなたが数えたいと思うのは、2つの言葉としてはできません

split("\\b\\w+?\\b")

http://www.regular-expressions.info/wordboundaries.html

0
amal

試してください:

line.split("[\\.,\\s!;?:\"]+");
or         "[\\.,\\s!;?:\"']+"

これは、次の文字の1つまたは一致です:., !;?:"'(スペースはあるが/または\はないことに注意してください)+は、複数の文字を1つとして数えます。

これにより、ほぼ十分な精度が得られます。より正確な正規表現では、解析する必要のあるテキストの種類に関する詳細情報が必要になります。これは、 'がWordの区切り文字にもなる可能性があるためです。ほとんどの句読点の単語区切り文字は空白の周りにあるため、[\\s]+も近似値になります。 (しかし、彼女は「いいえ」と言ったような短い引用では間違ったカウントをします。)

0
Angelo Fuchs