質問
あなたはどちらかとスキャナの区切り文字を設定するにはどうすればよいです。または改行?
私が試しました:
Scanner.useDelimiter(Pattern.compile("(\n)|;"));
しかし、それは動作しません。
解決
一般的なルールとして、パターンでは、あなたが\
を倍増する必要があります。
だから、試してみる。
Scanner.useDelimiter(Pattern.compile("(\\n)|;"));`
または
Scanner.useDelimiter(Pattern.compile("[\\n;]"));`
の の編集のの:\r\n
は問題がある場合は、あなたがこれをしようとする場合があります:
Scanner.useDelimiter(Pattern.compile("[\\r\\n;]+"));
\r
、\n
、及び;
の一つ以上に一致する
注の:私はこれらを試していません。
。他のヒント
あなたが発見したとして、あなたは(のみLF)DOS /ネットワークスタイル\r\n
(CRLF)行区切りの代わりに、Unixのスタイル\n
を探す必要がありました。しかし、テキストの両方が含まれている場合はどう?それは多くのことを起こります。私はこの非常にページのソースを表示するとき、実際に、私は両方の品種を参照してください。
あなたは、セパレータの両方の種類だけでなく、古いマックスタイル\r
(のみCR)を探しているの習慣に取得する必要があります。ここではそれを行うための一つの方法があります:
\r?\n|\r
プラグあなたのサンプルコードに、あなたが得ること:
scanner.useDelimiter(";|\r?\n|\r");
これは、あなたが一度に正確に一つの改行またはセミコロンを一致させたいと仮定しています。あなたは1をマッチさせたい場合は、の以上のがあなたの代わりにこれを行うことができます:
scanner.useDelimiter("[;\r\n]+");
お知らせ、あまりにも、私は正規表現の文字列で渡されたかの代わりに、パターンの。すべての正規表現は、その正規表現はあなたにどんなパフォーマンスの向上を取得していないプリコンパイル、自動的にキャッシュされます。
それが問題だったエンディング異なるライン(\ rを\ nまたはCRLF)だったようOPのコメントを見ると、それが見えます。
ここではどちらの形式で複数のセミコロンや改行コードを扱うでしょう、私の答えは、(または所望されない場合があります)です。
Scanner.useDelimiter(Pattern.compile("([\n;]|(\r\n))+"));
例えば。入力ファイル、このようになります。
1
2;3;;4
5
1,2,3,4,5
につながります私は通常みました\ nと、\\ nは - あなたはそれがエスケープ文字があるとして、それを倍増したい通常のバックスラッシュが必要な場合、私は同意するが、私の場合で働いていた両方。それはちょうどので、この場合に起こることを「\ n」は余分の有無にかかわらず目的の文字「\」
となり