0

Javaアプリケーションにいくつかの引数を渡そうとしていますが、引数を区切るために空白だけに依存しないインテリジェントなパーサーを使用して、自分でそれらを解析したいと思います。例:

/ update source = foo func =(bar、foo、foo、bar)

これはすべて、すべてをトークンに変換してからそれらを解析することでうまく機能します。ただし、次を追加すると問題が発生します。

path = "./ foo / bar / foo bar.txt"

(fooとbarの間の二重スペースに注意してください)。

二重引用符を使用すると、引数は単一の文字列として渡され、二重スペースが保持されます。引用符は次のように削除されます。

path = ./ foo / bar / foo bar.txt

これにより、パーサーが失敗します。しかし、'のように引用符として使用する他の文字を使用しようとすると、パーサーは正常に機能しますが、シェルは文字列を2つの別々の文字列として渡し、二重スペースで区切られるため、そこに2つのスペースがあったという情報が失われます。

リテラル文字列表現を保持するだけでなく、ユーザーが「'string'」のような奇妙な構造を入力しなくても、文字列が引用されたという情報を保持するために二重引用符を使用して引数を渡すにはどうすればよいですか?私はJavaを使用していますが、引数の行全体をシェルによって解析されないようにする方法はありますか?または、引用符を削除せずに?

ところで、私はこれをマイクロソフトのコマンドラインから実行しましたが、UNIXシェルをまだ試していません。これは、インターウェブで読んだものからの一重引用符でさえ失敗する可能性があります

4

2 に答える 2

1

Windowsコマンドライン(を使用cmd.exe)では、。を使用して二重引用符をエスケープできます\"。例えば、

java MyApp path=\"./foo/bar/foo bar.txt\"

結果として

args[0] = path="./foo/bar/foo
args[1] = bar.txt"

その間

java MyApp path="\"./foo/bar/foo  bar.txt\""

あなたに与える

args[0] = path="./foo/bar/foo  bar.txt"
于 2013-02-20T14:42:59.973 に答える
0

私が得た助けに感謝します、しかし私はすでにそれを理解しました:

  • 引用できるものには、括弧、コンマ、または等号が含まれていないことを知っています。これは、私のパーサーが認識するものです。

  • 何かが引用され、それにスペースが含まれている場合、それらのスペースは分割引数内にまだ存在することを私は知っています。

  • 元の引数の文字列は空白のすべての領域で分割されることを知っているので、最後の分割引数にはスペースは含まれず、引用符で囲まれた部分にのみ含まれます。

したがって、分割引数を解析する場合、そこにあるスペースは新しいトークンを生成する必要があることを意味しないため、最終的な文字列トークンに保持されると想定できます。

main()メソッドで渡されたargs配列から作成した連結文字列の代わりに、引数の配列を受け入れるように、トークナイザーを書き直す必要があります。そうすれば、実際の空白をスキップする(配列の次の要素に入る)と引用符で囲まれた空白(その他の空白)を区別できます。

于 2013-02-21T13:27:26.413 に答える