「abc-def」のスキャナからのデリミタ機能の使用
-
09-09-2019 - |
質問
現在、「-」で区切られた単語を含むテキストファイルをフィルタリングしようとしています。言葉を数えたいです。
scanner.useDelimiter(("[.,:;()?!\" \t\n\r]+"));
単純に発生する問題は次のとおりです。「-」を含む単語は分離され、2 つの単語としてカウントされます。したがって、 \- でエスケープするだけでは解決策としては選択できません。
「foo-bar」のような単語を残し、「-」だけを除外して無視するように、delimiter-expression を変更するにはどうすればよいですか?
ありがとう ;)
解決
OK、私はここにあなたの質問に推測している:あなたは右、いくつかの「本当の」散文のテキストファイル、つまり実際に意味をなす文章を持っているなどの句読点等により分離されていることを意味します<? / P>
例:
このような状況が改善される - 限り、我々が言うことができるように - 私たちの最も信頼できる同盟国は、Vorgonsが、その詩のスラムコンテストを開催し続けているという事実によって、敵も自分のミュート-O-Maticのデバイスと、それを妨害するインセンティブを持っています。
だから、何を区切り文字として必要なのは(あなたはすでにあなたが示した正規表現で覆われている)、空白および/または句読点の任意の量、またはそれぞれの側に少なくとも一つの空白文字に囲まれて、ハイフンのいずれかである何かであります。 「|」のための正規表現文字は「または」です。多くの正規表現の実装での空白文字クラスのショートカット(スペース、タブ、改行)があります:「\ sは」
"[.,:;()?!\"\s]+|\s+-\s+"
他のヒント
...読み正規表現は非常に容易になります。オプションのためのjava.util.regex.Patternのを参照してください。
多分これはあなたが探しているものです
string.split("\\s+(\\W*\\s)?"
読み込み:必要に応じて、ゼロまたはそれ以上の非単語文字と空白文字が続くマッチ1以上の空白文字を
。これは非常に単純ではありません。しようとする一つのことは、{電流デリミタ、文字} {0個以上、ハイフン} {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+)*"));
}
注意
next(String) メソッドは、元の useDelimiter() メソッドが「|」を欠いているため、単語のみを取得すると主張します。
注意
正規表現「 | 」を行末記号として使用しました。java.util.regex.Pattern の JavaDocs には、その他の考えられる行終了文字が示されているため、より完全なチェックには式 " |[ \u2028\u2029\u0085]" が使用されます。
これは十分に単純なはずです。 [^\\w-]\\W*|-\\W+
- もちろん、それが散文であり、除外したい場合は、 アンダースコア:
[^\\p{Alnum}-]\\P{Alnum}*|-\\P{Alnum}+
- または、数値を期待しない場合は次のようにします。
[^\\p{Alpha}-]\\P{Alpha}*|-\\P{Alpha}+
編集: これらはより簡単な形式です。行の先頭と末尾のダッシュを処理する完全なソリューションはこのパターンに従うことに注意してください。 (?:^|[^\\w-])\\W*|-(?:\\W+|$)