Get backlink values ​​and change these values

Could you explain why im failed to get backlink values ​​from the result of the matched regular expression and apply it to the modification before an effective replacement?

The expected result replaces, for example, the string ".coord('X','Y')" with "X * Y" . But if X > to some value, divide this value by 2, and then replace this new value.

Here is the im code that is currently being tested:

See /*>>1<<*/ and /*>>2<<*/ and /*>>3<<*/ , this is where I got stuck!

I would like to be able to apply a modification of backrefrences before replacement depending on the values ​​of backlinks.

The difference between /*>>2<<*/ and /*>>3<<*/ is just an anonymous self call function

The method /*>>2<<*/ is the expected working solution, since i can understand it. But, strangely enough, the replacement does not work correctly, replacing the alias $1 * $2 , and not the value ...?

You can check 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; }​ 

Of course, I missed something, but I can not understand!

Thanks for your help, hello.

EDIT WORKING METHOD: Lastly, get it as directed by Eric:

The main thing is that the function returns literal text for substitute, and not a string that is parsed for backlinks.

JSFIDDLE

So, the full working code: (note that replacing the template will change for each matching template, and speed code optimization is not a problem here, I will save it like that)

  $('#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]; }​ 
+4
source share
2 answers
 .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; })); 
+3
source

If I understand correctly, you are not getting the desired result, because

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

So, your initial array is not created for how you want to use it.
Try something like

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

and call

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

Source: https://habr.com/ru/post/1440943/


All Articles