2009-04-15 9 views
0

現在、「 - 」で区切られた単語を含むテキストファイルをフィルタリングしようとしています。私は言葉を数えたい。「abc-def」のスキャナから区切り文字を使用する

scanner.useDelimiter(("[.,:;()?!\" \t\n\r]+")); 

「 - 」を含む単語は2つの単語で分かれてカウントされます。だから、\でエスケープするのは、選択肢の解決策ではありません。

"foo-bar"のような単語は残されますが、 " - "だけが除外され無視されるように、区切り文字式を変更するにはどうすればよいですか?

ありがとう;)

+0

これは明確ではありません。あなたが望むもののサンプルをいくつか入れてもらえますか? – chburd

+0

@chburd:彼は "one two-three-four"を3ワードにしたいと思うと思う。 –

答えて

1

[OK]をここであなたの質問に推測している:あなたはいくつかの "本物の散文を持つテキストファイルを持っている、つまり実際に意味のある文章、句読点などで区切られている、

例:

この状況が改善される - 限り、我々が言うことができるように - 私たちの最も信頼できる同盟国は、Vorgonsが、その詩のスラムコンテストを開催し続けているという事実によって、敵は、Mute-O-Maticデバイスであっても、それを妨げるインセンティブはほとんどありません。

だから、あなたが区切り文字として必要なものを空白の量および/または句読点(あなたはすでにあなたが示した正規表現で覆われている)、または少なくとも一つの空白文字に囲まれて、ハイフンのいずれかである何かでありますそれぞれの側に。 "or"の正規表現文字は "|"です。多くの正規表現の実装では、空白文字クラス(スペース、タブ、および改行)のショートカットがあります: "\ s"。

"[.,:;()?!\"\s]+|\s+-\s+" 
0

これはあまり簡単ではありません。試みるべきことの1つは{current-delimeter-chars} {ゼロ以上のハイフン} {ゼロ以上の現在のdelimeter-chars-or-hyphen}です。

それはちょうどハイフン

0

可能試みが事前定義されたクラスを使用する場合の完全成るスキャナによって返された単語を無視する方が簡単かもしれません...読み正規表現は非常に容易になります。オプションについては、java.util.regex.Patternを参照してください。

は多分これはあなたが探しているものです。

string.split("\\s+(\\W*\\s)?" 

読み込み:マッチ1以上の空白文字は、必要に応じて、ゼロまたはそれ以上の非単語文字と空白文字が続きます。

+0

正規表現のパターンを二重にエスケープする必要があることを指摘する必要があります。そうしないと、コンパイラは\ fooが有効な文字列ではないと不満を持ちます。 – CurtainDog

0
Scanner scanner = new Scanner("one two2 - (three) four-five - ,....|"); 
scanner.useDelimiter("(\\B+-\\B+|[.,:;()?!\" \t|])+"); 

while (scanner.hasNext()) { 
    System.out.println(scanner.next("\\w+(-\\w+)*")); 
} 

NB

次の(String)メソッドを使用すると、オリジナルのuseDelimiter()メソッドミス以来、唯一の言葉を得ることを主張します "|" "| \ nは\ rを\ n" はラインとしてターミネータ

NB

あなたは正規表現を使用していました。 java.util.regexのJavaDocsパターンは、他の可能なラインターミネータを示し、これより完全なチェックが表現を使用します "\ rを\ n個| [\ rをする\ nを\ u2028 \ u2029 \ u0085]"

+0

\ Bはゼロ幅アサーションです。単語境界ではない位置に一致します。それは消費者には何の文字もないので、 '+'やその他の量子を追加するのは意味がありません。 Javaは量限定子を無視するだけですが、他の正規表現のフレーバではそれを構文エラーとして扱います。 –

+0

また、OPは "\ r \ n | \ n"を使用していません。彼は行区切り記号にまったく興味がありません。彼は、最も一般的な空白文字と、文字クラスの句読点文字を一致させているだけです(ただし、@Svanteのように "\ s"を使用する必要があります)。 –

+0

彼はuseDelimiter()で\ r \ nを使用しましたが、最初の説明に感謝します! :) – dfa

0

これは十分に単純でなければなりません:[^\\w-]\\W*|-\\W+

  • しかし、もちろん、それは散文だ、とあなたはを除外したい場合は、アンダースコア:
    [^\\p{Alnum}-]\\P{Alnum}*|-\\P{Alnum}+
  • たり、数値を期待していない場合:
    [^\\p{Alpha}-]\\P{Alpha}*|-\\P{Alpha}+

編集:これは簡単なフォームです。ラインの始めと終わりにダッシュを処理する完全な解決策がこのパターンに従うことに留意してください。 (?:^|[^\\w-])\\W*|-(?:\\W+|$)

関連する問題