获取反向引用值并修改这些值

时间:2012-10-20 09:48:55

标签: javascript jquery regex

您能否解释为什么我无法从匹配的正则表达式结果中获取反向引用的值,并在有效替换之前应用它进行一些修改?

预期结果是".coord('X','Y')"替换字符串"X * Y"。但如果X>取一些值,将此值除以2,然后使用此新值替换。

此处我正在测试的代码:

/*>>1<<*/&amp; /*>>2<<*/&amp; /*>>3<<*/,这就是我被困的地方!

我希望能够在替换之前根据反向引用值对backrefrence进行修改。

/*>>2<<*/&amp;之间的差异/*>>3<<*/只是自调用匿名函数参数

方法/*>>2<<*/i可以理解的预期工作解决方案。但奇怪的是,替换不能正常工作,用别名$1 * $2替换而不是用值替换......?

您可以测试jsfiddle

//string to test
".coord('125','255')"

//array of regex pattern and replacement //just one for the example
//for this example, pattern matching alphanumerics is not necessary (only decimal in coord) but keep it as it
var regexes = [ //FORMAT is array of [PATTERN,REPLACEMENT]
    /*.coord("X","Y")*/ [/\.coord\(['"]([\w]+)['"],['"]?([\w:\.\\]+)['"]?\)/g, '$1 * $2']
                  ];
function testReg(inputText, $output) {
    //using regex
    for (var i = 0; i < regexes.length; i++) {
        /*==>**1**/ //this one works as usual but dont let me get backreferences values
         $output.val(inputText.replace(regexes[i][0], regexes[i][2]));

         /*==>**2**/ //this one should works as i understand it
         $output.val(inputText.replace(regexes[i][0], function(match, $1, $2, $3, $4) { 
            $1 = checkReplace(match, $1, $2, $3, $4);
            //here want using $1 modified value in replacement
            return regexes[i][3]; 
        }));

         /*==>**3**/ //this one is just a test by self call anonymous function
         $output.val(inputText.replace(regexes[i][0], function(match, $1, $2, $3, $4) {
            $1 = checkReplace(match, $1, $2, $3, $4);
            //here want using $1 modified value in replacement
            return regexes[i][4];
        }()));

        inputText = $output.val();
    }
}

function checkReplace(match, $1, $2, $3, $4) {
    console.log(match + ':::' + $1 + ':::' + $2 + ':::' + $3 + ':::' + $4);
    //HERE i should be able if lets say $1 > 200 divide it by 2
    //then returning $1 value
    if($1 > 200) $1 = parseInt($1 / 2);
    return $1; 
}​

当然,我错过了什么,却无法得到它!

感谢您的帮助,问候。

编辑工作方法 最后得到它,正如埃里克所说:

  

关键是函数返回文字文本   替换,而不是为反向引用解析的字符串。

JSFIDDLE

如此完整的工作代码:(请注意,因为每个匹配模式的模式替换都会改变,速度代码的优化在这里不是问题,我会保持这样的)

 $('#btn').click(function() {
    testReg($('#input').val(), $('#output'));
});

//array of regex pattern and replacement //just one for the example
var regexes = [ //FORMAT is array of [PATTERN,REPLACEMENT] /*.coord("X","Y")*/ 
    [/\.coord\(['"]([\w]+)['"],['"]?([\w:\.\\]+)['"]?\)/g, '$1 * $2']
                     ];

function testReg(inputText, $output) {
    //using regex
    for (var i = 0; i < regexes.length; i++) {
        $output.val(inputText.replace(regexes[i][0], function(match, $1, $2, $3, $4) {
            var checkedValues = checkReplace(match, $1, $2, $3, $4);
            $1 = checkedValues[0];
            $2 = checkedValues[1];
            regexes[i][1] = regexes[i][1].replace('$1', $1).replace('$2', $2);
            return  regexes[i][1];
        }));
        inputText = $output.val();
    }
}

function checkReplace(match, $1, $2, $3, $4) {
    console.log(match + ':::' + $1 + ':::' + $2 + ':::' + $3 + ':::' + $4);
    if ($1 > 200) $1 = parseInt($1 / 2);
    if ($2 > 200) $2 = parseInt($2 / 2);
    return [$1,$2];
}​

2 个答案:

答案 0 :(得分:3)

.replace(regexes[i][0], function(match, $1, $2) {
    if ($1 > 200) $1 = parseInt($1 / 2);
    if ($2 > 200) $2 = parseInt($2 / 2);
    return $1 + "*" + $2;
})); 

答案 1 :(得分:1)

如果我理解正确,你没有得到你想要的结果,因为

'str'.replace( /(str)/, function(match,a){return '$1';} ) // "$1"

因此,您的初始数组不是根据您的使用方式构建的 尝试像

这样的东西
var regexes = [
    [ /\.coord\(['"]([\w]+)['"],['"]?([\w:\.\\]+)['"]?\)/g, function(match, $1, $2){return $1 + ' * ' + $2;} ]
];

并调用

return regexes[i][1](match, $1, $2, $3, $4);