2017-01-24 3 views
0

こんにちは私はこの正規表現を理解する助けが必要ですJavascript Regex Stumped

私は一連の文字列を持っています。彼らは動的ですが、設定されたパターンを持っています。その後、

name eq 'abc' 
id in 'def' 
key | operator | value 

私は修飾子を持っているが、私はこの正規表現

new RegExp(/(^(\s*!?has\s+)?([^\s]+)|(^\s*[^\s]+))/i) 

で修飾し、キーがない問題を抽出することができる午前

has name eq 'abc' 
!has id 
has address eq '123 sesame street' 
|modifier | key | operator | value 

「は」は問題がときに来てI修飾子と同じキーを持つ

has eq '123' 

戻って上記の正規表現は、私だけ

has has eq '123' 

上記のリターンが適切に処理するために、事業者の数が多い

「を持っている」しかし、彼らはセットされている「が持っている」必要「EQを持っています」

var keyval = '' 

keyval += "^\s*(\w+)\s+eq\s+'(.*)'$";  // for key eq 'val' 
keyval += "|^\s*has\s(\w+)\s+eq\s+'(.*)'$"; // for has key eq 'val' 

new RegExp(keyval, 'i'); 
:値

は、任意のヘルプはあなたが完全にすべての有効な構文を指定し、特定する必要が

+1

正規表現は、このための偉大なパターンですあなたは確か?なぜ単純なパーサーではないのですか? –

+0

@DaveNewton私のアプリケーションは、ここに見られるよりはるかに複雑です。私は自分のニーズに合ったものを見つけられませんでした。ご提案ください!私はそこに見たことがない多くがあります。 –

+0

'\ w +(?= \ s + eq \ b)'を使って** eq **の前にビットを選ぶことができますか?もちろん、演算子や修飾子の名前として 'eq'がある場合も同様です。 –

答えて

1

ご入力されたデータは、わずか数の可能なパターンに従っているようだ:

mod key 
    key op val 
mod key op val 

これは、すべてのデータの代表である、とあなたが整形式であるためにあなたの入力データを信頼する場合、簡単なショートカットを抽出することですすべてのトークンを抽出し、key op valパターンと他のパターンとを抽出されたトークンの数で区別することができる。

次のデモは正しく、問題のテストケースを識別し、アプローチを示しています

function extract(str){ 
 
    var result = str.match(/'[^']*'|\S+/g); 
 
    if(result.length == 3){// key op val 
 
    return { 
 
     key: result[0], 
 
     op: result[1], 
 
     val: result[2] 
 
    } 
 
    } else {// mod key OR mod key op val 
 
    return { 
 
     mod: result[0], 
 
     key: result[1], 
 
     op: result[2], 
 
     val: result[3] 
 
    } 
 
    } 
 
} 
 

 
console.log(extract("!has id")); 
 
console.log(extract("has eq '123'")); 
 
console.log(extract("has has eq '123'"));

+0

あなたは値がフリーテキスト文字列でスペースを含むことができると仮定してこれを修正することができますか? –

+0

値が引用符で囲まれている場合、例のように、デモコードはすでにフリーテキスト(真引用符を除くすべての文字)をサポートしています。それ以外の場合は、これとは異なるアプローチが必要です。 –

+0

ありがとう、私はテストします! –

4

をいただければ幸いですあなたの正規表現の主な問題は、 eqが重要なキーワードであることを認識するために失敗していることを

keyval += "|^\s*!?has\s+(\w+)$"; // for has key and !has key 

注:

私はあなたが追加することができますが、ない場合は値を持たないhas var!has var行が必要かどうかわからないんだけど。


その他の注意事項:

個人的に私はこのために1つの正規表現を使用することはありません。そうすることで、正規表現は長く複雑になり、また、マッチの抽出も難しくなります。上のトリックを使用して長い正規表現を分割することはできますが、私の意見では、多くの小さな正規表現を使用する方が良いです。私は次のようなものを書くだろう:

これは、巨大な正規表現と比較してはるかに維持可能です。一般的な言い分では、htmlのようなものを正規表現で解析することはできないが、人々が実際に言いたいことは、あなたが単一の正規表現でそれを行うことができないということである。ほとんどすべてのhtmlパーサはトークン化プロセスでregexpを使用し、その後、ifforループを使用してデータの構造を処理します。

+0

はい、これは本当に私を考えさせます!これは良いアプローチです。私はこのアイデアを今夜適用し、私の所見を更新します –