5

optparse-js ライブラリで使用できるように引数の配列を取得したいので、次のようなものがある場合

-f foo -b -a -z baz bar

このような配列が欲しい

["-f", "foo", "-b", "-a", "-z", "baz", "bar"]

内部にエスケープ引用符と長い GNU オプションを含む文字列で動作するはずです。これまでのところ、文字列に一致する正規表現があります

/("(?:\\"|[^"])*"|'(?:\\'|[^'])*')/g

"das"または"asd\"asd"または'asd'またはのような文字列に一致します'sad\'asd'

これに正規表現を使用できますか、それともパーサー (PEG を使用するなど) が必要ですか?

-p "hello b\"ar baz" -f /^ [^ ]+ $/

更新: @Damask の助けを借りて、この正規表現を作成しました:

/('(\\'|[^'])*'|"(\\"|[^"])*"|\/(\\\/|[^\/])*\/|(\\ |[^ ])+|[\w-]+)/g

次のような文字列に対して機能します。

echo -p "hello b\"ar baz" -f /^ [^ ]+ $/

戻る

['echo', '-p', '"hello b\"ar baz"', '-f', '/^ [^ ]+ $/']

しかし、次のような文字列で失敗した場合:

echo "©\\\\" abc "baz"

3 つの引数のデモではなく、コマンドと 2 つの引数に一致します

引数に "foo"baz のようなスペースがない場合は、配列内の 1 つの項目にする必要があります。引用符を含める必要がありますが、文字列からエスケープされていないものを削除します (bash でecho "foo"barecho を実行すると 1 つの foobar 引数が取得されるように)。

4

8 に答える 8

2

単純に分割機能を使用しないのはなぜですか?

var arr = myString.split(/\s+/);

セパレーターがある場合\tや複数のスペースがある場合などのバグを回避するために、引数として正規表現を渡す方がよいでしょう。

編集:

引数にスペースがあり、引用符で囲まれている場合、単一の正規表現を見つけることができないと思います。最初にスペースを含む引数を見つけ(/"(.*?)"/グループ1で引数を取得します)、それらを配列に追加してから文字列から削除し、その後でのみ上記のように分割メソッドを使用する必要があると考えてください。

于 2012-12-10T07:23:08.823 に答える
0

これを試して:

var a = '-f foo "ds  df s\\" da" -b -a -z baz bar';
a.match(/([\w-]+|"(\\"|[^"])*")/g)

戻り値[ "-f", "foo", ""ds df s\" da"", "-b", "-a", "-z", "baz", "bar"]

于 2012-12-10T07:47:54.413 に答える
0

これはうまくいきます:

var input = '-p "hello b\"ar baz" -f /^ [^ ]+ $/ -c -d -e'
var arr = input.split(' -');
var out = [];
for(var i = 0; i < arr.length; i++){
    if(~arr[i].indexOf(' ')){
        out = out.concat([arr[i].substring(0, arr[i].indexOf(' ')), arr[i].substring(arr[i].indexOf(' ')+1)])
    }else{
        out = out.concat('-'+arr[i]);
    }
}

出力:

["-p", ""hello b"ar baz"", "f", "/^ [^ ]+ $/", "-c", "-d", "-e"]

派手な 1 行の正規表現ではないことはわかっていますが、期待どおりに機能します。

于 2012-12-10T07:51:11.157 に答える
0
 var string = "-f foo -b -a -z baz bar";
        string = string.split(" ");
    var stringArray = new Array();
    for(var i =0; i < string.length; i++){
        stringArray.push(string[i]);
    }
    console.log(stringArray);

出力はこのようなコンソールになります

配列 [「-f」、「foo」、「-b」、「-a」、「-z」、「baz」、「bar」]

于 2017-05-03T10:15:20.027 に答える
-1

この問題の別のオプション: https://github.com/elgs/splitargs

于 2015-02-27T06:50:39.043 に答える
-1

わかりました、この質問のバウンティを作成したとしても、正規表現一致の偶数文字の助けを借りて答えを見つけました

私の正規表現は次のようになります。

/('((?:[^\\]*(?:\\\\)*\\')+|[^']*)*'|"(?:(?:[^\\]*(?:\\\\)*\\")+|[^"]*)*"|(?:\/(\\\/|[^\/])+\/[gimy]*)(?=:? |$)|(\\\s|\S)+|[\w-]+)/

デモあり

編集:@sinの提案により、正規表現が改善されます:

/("[^"\\]*(?:\\[\S\s][^"\\]*)*"|'[^'\\]*(?:\\[\S\s][^'\\]*)*'|(?:\/(\\\/|[^\/])+\/[gimy]*)(?=:? |$)|(\\\s|\S)+|[\w-]+)/
于 2017-04-30T21:53:39.960 に答える