1

IRC メッセージを介してユーザーから入力を受け取る Java ボットに取り組んでいます。ユーザーが .host file=foo file=bar hostname="this is a name" のように入力すると、入力に基づいてサーバーが起動します。

現在、基本的にメッセージを解析し、hostname="" (引用符でカプセル化する必要があります) を探し、hostname= の部分を分割し、ホスト名を結果が何であれ (たとえば、hostname="this is) に設定するメソッドがあります。 a name" は -hostname 'this is a name' になります)。これを行うために正規表現を使用しています。

次に、文字列を (スペースで区切って) 配列に分割し、その情報を processbuilder に渡します。これにより、独自のスレッドでコマンドが実行されます。最終的なコマンドは次のようになります。

./server -hostname "これは名前です"

私が直面している問題は、スペースで分割しているため、ユーザーがホスト名にダッシュを追加すると (たとえば、hostname="this is - a name")、ダッシュが引数を参照していると見なされることです。 、そして基本的に残りを切り落とします。

詳細な説明: processbuilder はスペースで分割されるため、「-hostname」、「this」、「is」、「-」、「a」、「name」が渡されます。- は引数を渡す必要があることを意味しますが、それは私がそれを使用しているものではないため、これは私が問題を抱えている場所です。

渡される文字が文字通りこの文字だけになるようにこれを実装する最も効率的な方法は何でしょうか? スペースで分割するべきではありませんか? Linux シェルから ./server -hostname "this is - a name" を実行すると、正常に動作します。

すべての助けに感謝します。ありがとうございました!

4

2 に答える 2

3

Runtime.exec と ProcessBuilder の両方がコマンドのリストを取得します。

Runtime.exec(new String[]{"./server", "-hostname", "this is - a name"};
ProcessBuilder pb = new ProcessBuilder("./server", "-hostname", "this is - a name");

これは基本的に、スペースや余分な文字などを気にする必要がないように、各要素が個別のパラメーターとしてコマンド (最初の引数) に渡されることを意味します。

于 2012-10-12T21:19:19.877 に答える
0

以前の方法とスペースでの分割の代わりに、コードを完全に変更し、正規表現を使用してユーザーからの入力を解析することにしました。これは、「+ sv_hostname」、「test」、「-」、「name」ではなく、完全な「+ sv_hostname ="test--name"」として配列リストに入力を追加できることを意味します。

于 2012-10-13T01:28:57.343 に答える