0

I'm currently trying to filter a text-file which contains words that are separated with a "-". I want to count the words.

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

The problem which occurs simply is: words that contain a "-" will get separated and counted for being two words. So just escaping with \- isn't the solution of choice.

How can I change the delimiter-expression, so that words like "foo-bar" will stay, but the "-" alone will be filtered out and ignored?

Thanks ;)

4

5 に答える 5

1

OK、私はここであなたの質問を推測しています: あなたは、いくつかの「本物の」散文、つまり実際に意味のある文を含むテキスト ファイルを持っていることを意味し、句読点などで区切られていますよね?

例:

この状況は、私たちが知る限り、最も信頼できる同盟国であるヴォルゴンが詩のスラムコンテストを開催し続けているという事実によって改善されています。敵は、Mute-O-Matic デバイスを使用したとしても、それを妨害する動機をほとんど持っていません。

したがって、区切り文字として必要なのは、任意の量の空白および/または句読点 (示した正規表現で既にカバーされています)、または両側に少なくとも 1 つの空白で囲まれたハイフンのいずれかです。「または」の正規表現文字は「|」です。多くの正規表現の実装には、空白文字クラス (スペース、タブ、および改行) のショートカットがあります: "\s"。

"[.,:;()?!\"\s]+|\s+-\s+"
于 2009-04-15T10:16:24.447 に答える
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

next(String)メソッドは、元のuseDelimiter()メソッドが「|」を見逃しているため、単語のみを取得することを表明します。

NB

正規表現「\r\ n |\n」を行末記号として使用しました。java.util.regex.PatternのJavaDocsは、他の可能な行末記号を示しているため、より完全なチェックでは、式「\ r \ n | [\ r \ n \ u2028 \ u2029\u0085]」を使用します。

于 2009-04-15T10:59:30.147 に答える
0

これは十分に単純なはずです:[^\\w-]\\W*|-\\W+

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

編集:これらはより簡単な形式です。行の最初と最後のダッシュを処理する完全なソリューションは、このパターンに従うことに注意してください。(?:^|[^\\w-])\\W*|-(?:\\W+|$)

于 2009-04-15T16:11:53.700 に答える
0

可能であれば、定義済みのクラスを使用してみてください...正規表現が読みやすくなります。オプションについては、java.util.regex.Pattern を参照してください。

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

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

読み取り: 1 つ以上の空白文字に一致し、任意で 0 個以上の単語以外の文字と空白文字が続きます。

于 2009-04-15T10:14:51.157 に答える