JavaScript replace/regex

后端 未结 3 503
囚心锁ツ
囚心锁ツ 2020-11-27 14:02

Given this function:

function Repeater(template) {

    var repeater = {

        markup: template,

        replace: function(pattern, value) {
                     


        
相关标签:
3条回答
  • 2020-11-27 14:07

    You need to double escape any RegExp characters (once for the slash in the string and once for the regexp):

      "$TESTONE $TESTONE".replace( new RegExp("\\$TESTONE","gm"),"foo")
    

    Otherwise, it looks for the end of the line and 'TESTONE' (which it never finds).

    Personally, I'm not a big fan of building regexp's using strings for this reason. The level of escaping that's needed could lead you to drink. I'm sure others feel differently though and like drinking when writing regexes.

    0 讨论(0)
  • 2020-11-27 14:29

    In terms of pattern interpretation, there's no difference between the following forms:

    • /pattern/
    • new RegExp("pattern")

    If you want to replace a literal string using the replace method, I think you can just pass a string instead of a regexp to replace.

    Otherwise, you'd have to escape any regexp special characters in the pattern first - maybe like so:

    function reEscape(s) {
        return s.replace(/([.*+?^$|(){}\[\]])/mg, "\\$1");
    }
    
    // ...
    
    var re = new RegExp(reEscape(pattern), "mg");
    this.markup = this.markup.replace(re, value);
    
    0 讨论(0)
  • 2020-11-27 14:32

    Your regex pattern should have the g modifier:

    var pattern = /[somepattern]+/g;
    

    notice the g at the end. it tells the replacer to do a global replace.

    Also you dont need to use the RegExp object you can construct your pattern as above. Example pattern:

    var pattern = /[0-9a-zA-Z]+/g;
    

    a pattern is always surrounded by / on either side - with modifiers after the final /, the g modifier being the global.

    EDIT: Why does it matter if pattern is a variable? In your case it would function like this (notice that pattern is still a variable):

    var pattern = /[0-9a-zA-Z]+/g;
    repeater.replace(pattern, "1234abc");
    

    But you would need to change your replace function to this:

    this.markup = this.markup.replace(pattern, value);
    
    0 讨论(0)
提交回复
热议问题