0

私はJSの「コマンドライン」エミュレータを作っています。

私は正規表現を持っています: /([^\s"]+)|"([^\s"]+)"/g. echowyświetl、などの単一の単語に一致させたいjd923h90asd8。また、「文字列リテラル」と一致させたい - "this is a string"orのようなもの"f82h3 23fhn aj293 dgja3 xcn32"

match入力文字列に対してメソッドを使用して、すべての一致の配列を取得しています。しかし、問題は次のとおりです。正規表現が「文字列リテラル」に一致し、文字列を配列に返す場合、この文字列には二重引用符が含まれます。二重引用符は必要ありませんが、問題は、なぜ Regexp に二重引用符が含まれているのかということです。正規表現では、引用符はグループ""から除外されます。()Regexp にすべてが含まれているのはなぜですか?

編集:

var re = /([^\s"]+)|"([^\s"]+)"/g;

var process = function (text) {
    return execute(text.match(re));
}

var execute = function (arr) {
    console.log(arr);
    try {
        //... apply a function with arguments...
    } catch (e) {
        error(arr[0]+": wrong function");
        return "";
    }
}

入力に対してecho abc "abc def" "ghi"Regexp は array を返します["echo", "abc", "abc", "def", ""ghi""]。その入力から返される正規表現を作成したいと思います["echo", "abc", "abc def", "ghi"]

4

3 に答える 3

4

正規表現 ( "([^\s"]+)") の引用部分では、引用符内にスペースを使用できません。を削除してみてください\s。空の文字列 ( )に一致させる必要がある場合は、*代わりに使用することも検討できます。+""

/([^\s"]+)|"([^"]*)"/g 
于 2013-08-27T09:22:13.777 に答える
3

これが唯一可能な説明です。コードを見なくても。

group(1)またはを使用しgroup(2)ます。または。group()_ group(0)後の 2 つ (完全に同等) は、一致した文字列全体を常に返します。この場合、引用符が含まれます。これで何が起こっているのか説明できることを願っています。

PS: RegEx は「or」RegEx であるため、両方のコンテンツが同時に存在することはありませんgroup(1)group(2)一方、他方、または両方が null または空になります。一致がない場合は後で。

matchメソッドを使用して、すべての一致を配列として取得していることに気付きました。この場合、このメソッドは、それぞれの場合に一致した文字列全体を常にキャプチャすると言いましょう (上記と同等group(0))。他のグループ (1 や 2 など) を取得するように指示する方法はありません。結果として、次の 3 つの選択肢があります。

  1. "いくつかの「後処理」を通じて、結果の配列内の文字列から s を削除します。
  2. JavaScript のメソッドを使用しないmatchで、独自の同等のものを作成してください (その中の場合に応じてgroup(1)orを使用group(2)してください)。
  3. ゼロ幅の正の先読みおよび後読みとして引用符に一致するように正規表現を変更します。JavaScript がこれをサポートしているかどうかはわかりませんが、サポートされているはずです/([^\s"]+)|(?<=")([^\s"]+)(?=")/g
于 2013-08-27T09:19:41.943 に答える