0

別の正規表現リテラル内で1つのJavascriptリテラル(「文字列」など)を参照する簡単な方法はありますか?

Javascript Regexp にはある程度精通していますが、達人にはほど遠いです。ほんの一握りの式タイプ用の単純なパーサーを作成しようとしています。たとえば、1 つのタイプは次のような式です。

 `value gender 1='Male' 2 ='Female' 3="Didn't answer" >3 = 'Other';

たとえば、Jison とそれに付随する学習曲線でパーサー全体を作成するよりも、RegExp を使用する方が簡単だと思いました。

Javascript Regexpは任意の数の繰り返しサブグループをキャプチャできないようであり、分割する明確な文字がありません。サブグループを独自の正規表現で解析しています。

以下は問題なく動作しますが、正規表現リテラルは DRY とはかけ離れており、ほとんど判読できません。それぞれの上位レベルの構成は、下位レベルの構成を繰り返します。

var re_value_stmt = /value\s+(\w+)((?:\s+(?:[^=]+[=](?:(?:["][^"]+["])|(?:['][^']+[']))))+)/i
var re_value_clause = /([^=]+[=](\s*(?:(['][^']*['])|(["][^"]*["])))+)/ig
var re_value_elems =   /([^=]+)[=]\s*(?:(?:[']([^']*)['])|(?:["]([^"]*)["]))/ig

console.log(re_value_elems.exec("1='Male'"));
console.log(re_value_clause.exec("1=\"Male\" 2=\"Female\""));
console.log(re_value_stmt.exec("value gender 1='Male' 2='Female'"));

たとえば、(?:(?:["][^"]+["])|(?:['][^']+[']))just は を意味しQuotedStringます。代わりにそれを書いてもいいですか?

別の正規表現リテラル内で1つのJavascriptリテラル(「文字列」など)を参照する簡単な方法はありますか? 文字列を変更して正規表現を指定することもできますが、扱いにくく、エラーが発生しやすいようです (たとえば、引用符をエスケープしてエスケープをエスケープする必要があるなど)。

それとも、人々が文法に基づいてパーサーを作成し、Regexp から移行する理由は、すでにこれが代表的なものなのでしょうか?

4

0 に答える 0