JavaScript正则表达式捕获和替换

gde*_*dex 4 javascript regex

我有一个看起来像这样的字符串:

var whereClause = "p_id eq @p_id@ and idr_user_id eq @idr_user_id@";
Run Code Online (Sandbox Code Playgroud)

我有以下正则表达式来捕获令牌/(@\w + @)/ g

我希望能够用不同的值替换每个事件

whereClause.replace(/(@\w@)/g, projectID, userID);
Run Code Online (Sandbox Code Playgroud)

这会有用吗?任何想法都会有所帮助......

elc*_*nrs 7

你可以瞄准这样的事情:

template(string, {key: value, key: value});
Run Code Online (Sandbox Code Playgroud)

它可以使用replace回调在几行中实现:

function template(text, obj) {
  var regex = /@(\w+)@/g;
  return text.replace(regex, function(_, match) {
    return obj[match] || _;
  });
}

// Usage:
var str = 'p_id eq @p_id@ and idr_user_id eq @idr_user_id@';
var result = template(str, {p_id: 123, idr_user_id: 'ABC'});
//^ "p_d eq 123 and idr_user_id eq ABC"
Run Code Online (Sandbox Code Playgroud)

如果你需要不同的正则表达式或结构,你可以创建一个简单的闭包,如:

function template(regex, fn) {
  return function (text, obj) {
    return text.replace(regex, function(_, match) {
      return fn.call(obj, match);
    });
  }
};

// Using an array
var myTemplate = template(/%(\d+)/g, function(x) {
  return this[--x];
});
var str = 'Hello %1, foo %2';
var result = myTemplate(str, ['world', 'baz']);
//^ "Hello world, foo baz"
Run Code Online (Sandbox Code Playgroud)