1

「\」を使用してコマンドを複数行に拡張できるコマンドをキャプチャしようとしています。したがって、可能な区切り文字は次のとおりです。

Pattern assignment = Pattern.compile("[^\\\\]\\n");

もちろん、これには '\n' の前の '\' 以外の最後の文字が切り落とされるという問題があります。次のことを試みて、そのキャラクターを回復しようとしていました。

スキャナーへの入力は次の形式であるため、T1 D1 T2 D2 T3 D3 ....ここで、T# と D# はそれぞれトークンと区切り文字番号「#」に対応します。これでうまくいくと思いました。

Pattern p = Pattern.compile("\\\\?\\s+");

String residue = file.findInLine(assignment);
String curToken = file.next().trim();

if(residue == null)
   residue = "";
else
   residue = residue.trim();

Scanner tokens = new Scanner(curToken + residue).useDelimiter(p);

T1 と D1 の連結を取得する代わりに、スキャナーの区切り文字を無視することになっている findInLine は、パターンが区切り文字と同じ場合に null を返します。誰でもこの奇妙な動作を説明できますか?

4

1 に答える 1

0

私が望んでいた動作を取得する方法を考え出しましたが、私が試みていたことがうまくいかなかった理由をまだ理解していません。

解決策は、非 '\' を消費しない否定後読みを使用することです。

Pattern assignment = Pattern.compile("(?<!\\\\)\\n");
于 2013-01-23T21:03:32.253 に答える