1

"say \"Hello\""JavaScript ソース コードに適用すると、すべての有効な文字列リテラル ( など) と正規表現リテラル ( など)に一致する包括的な正規表現は存在します/and\/or/か? 式は、改行やエスケープ シーケンスを含むすべてのエッジ ケースをカバーする必要があります。

または、文字列と正規表現リテラル以外のパターンに一致する正規表現を知っている人はいますか?

私の目標は、デリミタ内のマクロ ({{@foo.bar}}または など#@foo.bar#) をプリプロセッサで展開できるようにする単純な JavaScript 構文拡張を実装することです。ただし、マクロをリテラルのでのみ処理したいと考えています。

今のところ、既存の JavaScript レクサー/パーサーを拡張することなく、文字列の置換のみを使用してこれを達成しようとしています。

この JavaScript プリプロセッサ自体は、JavaScript で実装されます。

4

4 に答える 4

1

これは、引用符で囲まれた文字列を照合するために使用している正規表現です。これは、バックトラッキングやバックリファレンス、またはそのブードゥーを必要としないため、ほとんどすべてのエンジンで機能するはずなので、かなり良いです。これは、リテラル内のすべてのテキストと一致します。

"(\\.|[^"])*"

エンジンによっては、キャプチャしないグループをサポートする場合があります。その場合、あなたは使用することができます

"(?:\\.|[^"])*"

そしてそれはより速いはずです。

于 2012-04-30T06:15:56.190 に答える
0

私はおそらく次のようなことをするつもりです。ただし、特定の可能な条件については改善する必要があります。

var str = '"aaa \"sss \\t bbb" sss #3 ss# ((t sdsds)) ff ';
str += '/gg sdfd \/dsds/ {aaa bbb} {{ss}} {#sdsd#}';

var repeating = ['"','\\\'','/','\\~','\\#'];
// "example" 'example' /example/ ~example~ #example#
var enclosing = [];
enclosing.push(['\\{','\\}']);
enclosing.push(['\\{\\{','\\}\\}']);
enclosing.push(['\\[','\\]']);
enclosing.push(['\\(\\(','\\)\\)']);
// {example} {{example}} [example] ((example))

for (var forEnclosing='',i = 0 ; i < enclosing.length; i++) {
    var e = enclosing[i];
    var r = e[0]+'(\\\\['+e[0]+e[1]+']|[^'+e[0]+e[1]+'])*'+e[1];
    forEnclosing += r + (i < enclosing.length-1 ? '|' : '');
}
for (var forRepeating='',i = 0; i < repeating.length; i++) {
    var e = repeating[i];
    var r = e+'(\\'+e+'|[^'+e+'])*'+e;
    forRepeating += r + (i < repeating.length-1 ? '|' : '');
}

var rx = new RegExp('('+forEnclosing+'|'+forRepeating+')','g');
var m = str.match(rx);
try { for (var i = 0; i < m.length; i++) console.log(m[i]) }
catch(e) {}

出力:

"aaa "sss \t bbb"
#3 ss#
((t sdsds))
/gg sdfd /dsds/
{aaa bbb}
{{ss}}
{#sdsd#}
于 2012-04-30T21:51:21.570 に答える
0

正規表現で得られる最も近いものは、文字列リテラル (一重引用符または二重引用符で囲まれた) または正規表現またはコメント (または偽の一致を含む可能性のあるもの) またはマクロのもののいずれかに一致する 1 つの正規表現を持つことです。

"[^"\\]*(?:\\.[^"\\]*)*"
|
'[^'\\]*(?:\\.[^'\\]*)*'
|
/[^/\\]*(?:\\.[^/\\]*)*/[gim]*
|
/\*[^*]*(?:\*(?!/)[^*]*)*\*/
|
#@(\w+\.\w+)#

試合後にグループ #1 に何かが含まれている場合、それは探しているものに違いありません。それ以外の場合は、この一致を無視して次の一致に進みます。

于 2012-04-30T22:51:17.047 に答える
0

これは正規表現には多すぎると思います。

を考慮してくださいvar foo = "//" // /"(?:\\.|[^"])*"/。文字列、コメント、および正規表現リテラルはどこで始まり、どこで終わりますか? すべてのエッジ ケースをカバーするには、完全な JavaScript パーサーを作成する必要があります。もちろん、パーサーは正規表現を使用します...

于 2012-08-29T08:23:58.620 に答える