10

スキャナーの区切り文字を次のいずれかに設定するにはどうすればよいですか。または改行?

私は試しました: Scanner.useDelimiter(Pattern.compile("(\n)|;")); しかし、それは動作しません。

4

3 に答える 3

16

原則として、パターンでは、 を 2 倍にする必要があります\

だから、試してみてください

Scanner.useDelimiter(Pattern.compile("(\\n)|;"));`

また

Scanner.useDelimiter(Pattern.compile("[\\n;]"));`

編集\r\n問題がある場合は、これを試してみてください:

Scanner.useDelimiter(Pattern.compile("[\\r\\n;]+"));

\r\n、およびの 1 つ以上に一致し;ます。

:私はこれらを試していません。

于 2009-12-30T17:59:06.257 に答える
9

お気づきのように、Unix スタイル(LF のみ)\r\nではなく、DOS/ネットワーク スタイル (CRLF) の行区切り記号を探す必要がありました。\nしかし、テキストに両方が含まれている場合はどうなるでしょうか。それはよく起こります。実際、このページのソースを見ると、両方の種類が表示されます。

\r古い Mac スタイル(CR のみ) だけでなく、両方の種類のセパレーターを探す習慣を身に付ける必要があります。これを行う1つの方法は次のとおりです。

\r?\n|\r

それをサンプルコードにプラグインすると、次のようになります。

scanner.useDelimiter(";|\r?\n|\r");

これは、一度に正確に 1 つの改行またはセミコロンと一致させたいと想定しています。1つ以上を一致させたい場合は、代わりにこれを行うことができます:

scanner.useDelimiter("[;\r\n]+");

パターンの代わりに正規表現文字列をどのように渡したかも注目してください。すべての正規表現は自動的にキャッシュされるため、正規表現を事前にコンパイルしてもパフォーマンスは向上しません。

于 2009-12-30T19:55:12.793 に答える
1

OPのコメントを見ると、問題だったのは別の行末(\ r \ nまたはCRLF)だったようです。

これが私の答えです。これは、複数のセミコロンと行末をいずれかの形式で処理します(望ましい場合と望ましくない場合があります)

Scanner.useDelimiter(Pattern.compile("([\n;]|(\r\n))+"));

たとえば、次のような入力ファイル:

1


2;3;;4
5

結果は1,2,3,4,5になります

私は通常の\nと\\nを試しました。どちらも私の場合は機能しましたが、通常のバックスラッシュが必要な場合はエスケープ文字であるため、2倍にすることに同意します。この場合、「\ n」は、余分な「\」の有無にかかわらず、目的の文字になります。

于 2009-12-30T18:29:08.407 に答える