防止替换 JavaScript 正则表达式中的转义序列

Prevent Replacing Escaped Sequence in JavaScript Regular Expressions

本文关键字:转义序列 正则表达式 JavaScript 替换      更新时间:2023-09-26

JSFiddler: http://jsfiddle.net/A3vg6/20/

    var regex = /(?:window|scope|data|owner)(?:'.[a-zA-Z_][a-zA-Z_0-9]*)*/gi;
    var path = [];
    var vars = [];
    var ms = txt.replace(regex,
        function (match) {
        var nv = "v" + (path.length + 1);
            if (match.indexOf("owner.")==0) {
                match = match.substr(6);
            }
            path.push(match);
            vars.push(nv);
            return nv;
        }
        );

我正在获得输出

data.x + data.y + $data.z + xdata => v1 + v2 + $v3 + xv4

但正确的输出应该是,

data.x + data.y + $data.z + xdata => v1 + v2 + data.z + xdata

因此,任何以 $ 开头的内容都应该被转义,如果数据出现在任何字符之后都不应该被替换。只有 4 个关键字,窗口、范围、数据和所有者,这些词需要用变量替换。

我讨厌正则表达式,但这必须是正则表达式,因为它将包含复杂的序列,例如。

data[ Calculate( x, data.y)] => v1[ Calculate(x,v2)]

我们现在收效甚微,但我对新序列有问题

data[data['x']] + data.x + data.y + $data.y + xdata

成为

v1v2['x']] +v3 +v4 + data.y + xdata

但它应该是

v1[v2['x']] +v3 +v4 + data.y + xdata

回答:

http://jsfiddle.net/A3vg6/44/

工作正常。

试试这个正则表达式:

/(^|[^'w])(?:window|scope|data|owner)(?:'.[a-zA-Z_][a-zA-Z_0-9]*)*/gi

并将函数更改为:

var ms = txt.replace(regex,
        function (match, prefix) {
            if (prefix == "$") return match.substr(1);
            var nv = "v" + (path.length + 1);
            match = match.substr(1);
            if (match.indexOf("owner.")==0) {
                match = match.substr(6);
            }
            path.push(match);
            vars.push(nv);
            return prefix + nv;
        }
        );

在这里尝试: http://jsfiddle.net/A3vg6/40/