Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript正则表达式捕获和替换_Javascript_Regex - Fatal编程技术网

JavaScript正则表达式捕获和替换

JavaScript正则表达式捕获和替换,javascript,regex,Javascript,Regex,我有一个字符串如下所示: var whereClause = "p_id eq @p_id@ and idr_user_id eq @idr_user_id@"; template(string, {key: value, key: value}); 我有以下正则表达式来捕获标记 /(@\w+@)/g 我希望能够用不同的值替换每个事件,例如 whereClause.replace(/(@\w@)/g, projectID, userID); 这样行吗?任何想法都会有帮助……你可以这样做:

我有一个字符串如下所示:

var whereClause = "p_id eq @p_id@ and idr_user_id eq @idr_user_id@";
template(string, {key: value, key: value});
我有以下正则表达式来捕获标记 /(@\w+@)/g

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

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

这样行吗?任何想法都会有帮助……

你可以这样做:

var whereClause = "p_id eq @p_id@ and idr_user_id eq @idr_user_id@";
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"

你可以这样做:

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

我以前在动态错误消息方面做过类似的工作。用你正在做的事情去做,事情会是这样的

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);
这种方法的优点之一是,您可以在不同的情况下使用不同的
whereClause
replacementText
变量,并且只有当
.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@";
。可以通过以下方式“服务”所有人:

。并生成有效消息


如果需要的话,用动态值填充
replacementText
对象也非常容易。

您正在公开一个where子句以供客户端操作?听起来像是一个即将发生的安全问题。@adam0101,where子句由从sqlLite数据库查询的值而不是人工输入填充。这将不起作用。JS replace方法只接受2个参数。任何附加参数都将被忽略。您必须创建一个RegExp对象,对字符串运行正则表达式,并循环匹配项。如果不应该替换映射中没有的标记,您可以执行
返回obj[match]| | |