JavaScript正则表达式捕获和替换

时间:2014-01-17 22:06:17

标签: javascript regex

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

var whereClause = "p_id eq @p_id@ and idr_user_id eq @idr_user_id@";

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

我希望能够使用不同的值替换每个匹配项,例如

whereClause.replace(/(@\w@)/g, projectID, userID);

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

3 个答案:

答案 0 :(得分:7)

你可以瞄准这样的事情:

template(string, {key: value, key: value});

可以使用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"

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

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"

答案 1 :(得分:4)

您可以执行以下操作:

whereClause.replace(/@\w+@/g, function(token) {
    switch (token) {
        case '@p_id@': return projectID;
        case '@idr_user_id@': return userID;
    }
    return token;
});

答案 2 :(得分:0)

我之前为动态错误消息传递做了类似的事情。为了做你正在做的事情,它会像这样。

function populateMessage(messageTemplate, replacementVals) {
    var newMessage = messageTemplate;

    for (var targetVal in replacementVals) {
        if (replacementVals.hasOwnProperty(targetVal)) {
            newMessage = newMessage .replace("@" + targetVal + "@", replacementVals[targetVal]);
        }
    }

    return newMessage;
}

var whereClause = "p_id eq @p_id@ and idr_user_id eq @idr_user_id@";
var replacementText = {"p_id": "SOME_TEXT_1", "idr_user_id": "SOME_TEXT_2"};
var outputValue = populateMessage(whereClause, replacementText);

这种方法的优点之一是您可以针对不同的情况使用不同的whereClausereplacementText变量,只有当.replace找到匹配项时才会进行替换。定义的键。所以:

var whereClause1 = "p_id eq @p_id@ and idr_user_id eq @idr_user_id@";
var whereClause2 = "p_id eq @p_id@";
var whereClause3 = "idr_user_id eq @idr_user_id@";

。 。 。可以全部由“服务”:

var replacementText = {"p_id": "SOME_TEXT_1", "idr_user_id": "SOME_TEXT_2"};

。 。 。并产生有效的信息。

如果需要,还可以很容易地使用动态值填充replacementText对象。