【问题标题】:Is it possible to chain jQuery Regexp matches?是否可以链接 jQuery Regexp 匹配?
【发布时间】:2014-04-19 07:05:53
【问题描述】:

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

工作代码:

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 }~]

【问题讨论】:

  • 您想编写一个真正选择您要查找的内容的正则表达式,而不是将两个部分链接在一起。 .match() 是一个 javascript 字符串函数,而不是 jquery 函数,因此 ti 返回一个结果数组(如果没有匹配则返回 null),这使得链接(带有错误控制)变得困难。你到底想在这里实现什么?
  • 在正文中找到 [~{ 任何 }~],然后从找到的内容中提取任何内容。
  • 工作代码部分完全符合我的要求,只是看看我是否可以优化它。

标签: jquery regex optimization match template-engine


【解决方案1】:

我刚刚为 [~{ ... }~] 结构中的单词使用了一个捕获组。

\[~\{ (\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]);
}

【讨论】:

  • 感谢您的回复,但这只是返回 [~{ header }~] 而不是返回 header
  • @JemiloII 看到我的最后更新。这将是一个匹配数组。每个匹配都是一个数组,其中包含 0 索引处的整个匹配 ([~{ header }~]) 和 1 索引处的捕获组 (header)。
  • 哇,这种方式真的很好用!我喜欢多维数组格式。这种格式将使以后更容易用更新的内容替换代码。对于 jsfiddle,如果您将 getfirebug.com/firebug-lite-debug.js 添加为外部资源,您将获得一个调试器。 jsfiddle.net/cqTAv/1
  • @JemiloII dang 我希望我能拥抱你的 JSFiddle 提示,非常方便个人和 SO 使用!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 2017-02-11
  • 1970-01-01
相关资源
最近更新 更多