是否可以链接jQuery Regex匹配?

时间:2014-04-18 22:31:04

标签: jquery regex optimization match template-engine

所以我只是好奇是否有办法连结正则表达式。只是想稍微优化我的代码。我想找到一个表达式,然后从结果中找到另一个表达式。

工作守则:

match = $('body').html().match(/(\[~\{ .*? \}~\])/g);
console.log(match[0]);

findText = match[0].match(/\w+/);
console.log(findText);

我尝试过的事情:

match = $('body').html().match(/(\[~\{ .*? \}~\])(\w+)/g);
console.log(match[0]);

产生错误

match = $('body').html().match(/(\[~\{ .*? \}~\])|(\w+)/g);
console.log(match[0]);

在表达式1之外找到表达式1然后找到表达式2。

我的HTML:

[~{ header }~]

<p>This is the home page</p>

[~{ footer }~]

1 个答案:

答案 0 :(得分:2)

我只是在[~{ ... }~]结构中使用了捕获组。

\[~\{ (\w+) \}~\]

唯一的区别是我匹配(\w+)而不是.*?。我还删除了整个表达式周围的捕获组((...)),因为它没有必要。

Regex101


现在在Javascript中访问多个捕获组有点困难,但我使用了this answer中的一些示例代码(感谢Mathias Bynens):

function getMatches(string, regex) {
    var matches = [];
    var match;
    while (match = regex.exec(string)) {
        matches.push(match);
    }
    return matches;
}

var myString = $('body').html();
var myRegEx = /\[~\{ (\w+) \}~\]/g;

var matches = getMatches(myString, myRegEx);
console.log(matches[0]);

输出:

Array[2]
  0: "[~{ header }~]"    // The whole match
  1: "header"            // The captured group

JSFiddle


所以你的最终代码看起来像这样(这是伪代码):

matches; // this is set from previous code block

for(var i = 0; i < matches.length; i++) {
    var needsToBeReplaced = matches[i][0];
    var template = getTemplate(matches[i][1]);
}