JavaScript - string regex backreferences

后端 未结 5 1657
抹茶落季
抹茶落季 2020-11-27 02:51

You can backreference like this in JavaScript:

var str = \"123 $test 123\";
str = str.replace(/(\\$)([a-z]+)/gi, \"$2\");

This would (quite

相关标签:
5条回答
  • 2020-11-27 03:31

    Using ESNext, quite a dummy links replacer but just to show-case how it works :

    let text = 'Visit http://lovecats.com/new-posts/ and https://lovedogs.com/best-dogs NOW !';
    
    text = text.replace(/(https?:\/\/[^ ]+)/g, (match, link) => {
      // remove ending slash if there is one
      link = link.replace(/\/?$/, '');
      
      return `<a href="${link}" target="_blank">${link.substr(link.lastIndexOf('/') +1)}</a>`;
    });
    
    document.body.innerHTML = text;

    0 讨论(0)
  • 2020-11-27 03:45

    Like this:

    str.replace(regex, function(match, $1, $2, offset, original) { return someFunc($2); })
    
    0 讨论(0)
  • 2020-11-27 03:48

    Pass a function as the second argument to replace:

    str = str.replace(/(\$)([a-z]+)/gi, myReplace);
    
    function myReplace(str, group1, group2) {
        return "+" + group2 + "+";
    }
    

    This capability has been around since Javascript 1.3, according to mozilla.org.

    0 讨论(0)
  • 2020-11-27 03:50

    If you would have a variable amount of backreferences then the argument count (and places) are also variable. The MDN Web Docs describe the follwing syntax for sepcifing a function as replacement argument:

    function replacer(match[, p1[, p2[, p...]]], offset, string)
    

    For instance, take these regular expressions:

    var searches = [
        'test([1-3]){1,3}',  // 1 backreference
        '([Ss]ome) ([A-z]+) chars',  // 2 backreferences
        '([Mm][a@]ny) ([Mm][0o]r[3e]) ([Ww][0o]rd[5s])'  // 3 backreferences
    ];
    for (var i in searches) {
        "Some string chars and many m0re w0rds in this test123".replace(
            new RegExp(
                searches[i]
                function(...args) {
                    var match = args[0];
                    var backrefs = args.slice(1, args.length - 2);
                    // will be: ['Some', 'string'], ['many', 'm0re', 'w0rds'], ['123']
                    var offset = args[args.length - 2];
                    var string = args[args.length - 1];
                }
            )
        );
    }
    

    You can't use 'arguments' variable here because it's of type Arguments and no of type Array so it doesn't have a slice() method.

    0 讨论(0)
  • 2020-11-27 03:51

    Note: Previous answer was missing some code. It's now fixed + example.


    I needed something a bit more flexible for a regex replace to decode the unicode in my incoming JSON data:

    var text = "some string with an encoded '&#115;' in it";
    
    text.replace(/&#(\d+);/g, function() {
      return String.fromCharCode(arguments[1]);
    });
    
    // "some string with an encoded 's' in it"
    
    0 讨论(0)
提交回复
热议问题