0

正規表現を使用して、コマンド文字列をセグメントに分割する必要があります。カスタム関数を作成するための非常に基本的なパーサーを探しています。たとえば、次のコマンドがあります。

rm --remove all --keep some --but-not *.php --or-like "?-imp-*.*"

ここで、この文字列をそれぞれ引数の名前と値を含む複数のセグメントに分割したいと思います。

rm
--remove all
--keep some
--but-not *.php
--or-like "?-imp-*.*"

したがって、各セグメントを空白からさらに分割し、引数の名前と値を分離することができます。

私は正規表現が苦手です。これまでのところ、引数と値の部分のみを抽出するためにこの正規表現を作成しましたが、文字列の末尾にある単語*や、およびのような特殊文字を含む単語には一致しません。?

正規表現

(?<=\s)--([^--]*)(?=(\s--))

そして、コマンドの名前を取得します

(^\w+)

これについて何か考えはありますか?

4

3 に答える 3

1

Javascriptでの実装例:

var match,
    str = 'rm --remove all --keep some --but-not *.php --or-like "?-imp\'\'-*.*"',
    args = [],
    reg = /\s--(\S+)\s+((["']).*?[^\\]\3|\S+)/g;

while ( match = reg.exec( str ) ) {
    args.push( [ match[1], match[2] ] );
}

console.log( args );

/* 
    [ [ "remove", "all" ], [ "keep", "some" ],
      [ "but-not", "*.php" ], [ "or-like", ""?-imp-*.*"" ] ]
 */

注:これは完全に防水することを意図したものではなく、コマンドの形式を最初に検証する必要があります。

既知の制限:引数の値は引用符で始まらない場合があり、終了引用符がない場合があります。たとえば、"やなどの値'nは解析を中断します。

于 2013-01-26T12:47:44.453 に答える
1

構文解析に正規表現を使用することはお勧めできませんが、トークン化には正規表現を使用する必要があります。

そうは言っても、シナリオに一致する不完全な正規表現は次のとおりです(ただし、すべてのユースケースではありません)

ジャバスクリプトで実装...

str = 'rm --remove all --keep some --but-not *.php --or-like "?-imp-*.*"'   
regex = /(^\w+\b|--[\w-]+(\s([\w*.]+|".+?"))?)/g
res = str.match(regex)
// ['rm','--remove all','--keep some','--but-not *.php','--or-like "?-imp-*.*"']

各項目をさらに処理して、キーと値に分割する必要があります。

于 2013-01-26T12:58:08.287 に答える
0

その目的のために、Javascript 用に GetOpt を実装するライブラリを使用します (そうしないと、車輪を再発明することになります)。

簡単なグーグル検索では、次の情報が表示されました。

注、私はこれらのいずれも試していません。

于 2013-01-26T16:12:36.810 に答える