3

Java で Scanner クラスを使用して、構成ファイルからデータを取得しようとしています。ファイルの要素は空白で区切られています。ただし、句または要素を文字列リテラル (空白を含む) として解釈する必要がある場合は、要素を二重引用符または単一引用符で囲みます。これにより、次のようなファイルが得られます。

> R 120 Something AWord

> P 160 SomethingElse "A string literal"

Java Scanner クラスを使用する場合、デフォルトでは空白だけで区切られます。Scanner クラスには、正規表現を使用してテキストの別の区切り文字を指定する useDelimiter() 関数があります。ただし、正規表現が苦手なので、どうすればよいかわかりません。

何かを囲む引用符がない限り、どうすれば空白で区切ることができますか?

4

1 に答える 1

5

メソッドを使用して、scanner.findInLine(pattern)文字列リテラルが分割されないように指定できます。引用符なしのトークンまたは引用符付きのトークンに一致する正規表現が必要です。これはうまくいくかもしれません:

"[^\"\\s]+|\"(\\\\.|[^\\\\\"])*\""

(この正規表現は、文字列リテラル内でエスケープを処理するため、非常に複雑です。)

例:

String rx = "[^\"\\s]+|\"(\\\\.|[^\\\\\"])*\"";
Scanner scanner = new Scanner("P 160 SomethingElse \"A string literal\" end");
System.out.println(scanner.findInLine(rx)); // => P
System.out.println(scanner.findInLine(rx)); // => 160
System.out.println(scanner.findInLine(rx)); // => SomethingElse
System.out.println(scanner.findInLine(rx)); // => "A string literal"
System.out.println(scanner.findInLine(rx)); // => end

名前が示すように、このfindInLineメソッドは現在の行内でのみ機能します。入力全体を検索したい場合は、findWithinHorizon代わりに使用できます。地平線として渡し0て、無制限の地平線を使用するように指示できます。

scanner.findWithinHorizon(rx, 0);
于 2012-09-10T23:20:30.990 に答える