1

スキャナーに特定の区切り文字をトークンとして使用させる良い方法を見つけようとしています。たとえば、テキストを数字のチャンクと数字以外のチャンクに分割したいので、理想的には区切り文字を\Dに設定し、useDelimiterAsToken のようなフラグを設定するだけですが、API を簡単に調べた後、私はそうではありません何でも思いつきます。現在、区切り文字に先読み/後読みを組み合わせて使用​​することに頼らなければなりませんでしたが、これはやや苦痛です:

scanner.useDelimiter("((?<=\\d)(?=\\D)|(?<=\\D)(?=\\d))");

これは、数字から非数字へ、またはその逆への遷移を探します。これを行うためのより健全な方法はありますか?

4

1 に答える 1

2

編集:編集された質問は非常に異なっているため、元の回答はまったく当てはまりません。記録として、私の意見では、あなたがしていること問題を解決するための理想的な方法です。あなたの区切り文字は、数字と非数字の間のゼロ幅の境界であり、投稿したものよりも簡潔に表現する方法はありません.

EDIT2:(コメントで尋ねられた質問に応えて。)最初にこの正規表現の代替を求めました:

"((?<=\\w)(?=[^\\w])|(?<=[^\\w])(?=\\w))"

\bこれは、単語境界構成体である が機能する方法とほぼ同じです。

"(?<=\\w)(?!\\w)|(?<!\\w)(?=\\w)"

つまり、前に単語文字があり、その後に単語文字がないか、または後に単語文字があり、前に単語文字がない位置です。違いは\b、入力の最初と最後で一致できることです。あなたは明らかにそれを望まなかったので、これらの条件を除外するためにルックアラウンドを追加しました:

"(?!^)\\b(?!$)"

正規表現が行ったことを行うためのより簡潔な方法です。しかし、その後、要件を数字/非数字の境界に一致させるように変更しました\b。単語/非単語の境界のような短縮形はありません。

于 2010-03-03T11:53:16.507 に答える