使用带括号正则表达式的 Regex.exec() 来提取字符串的匹配项

有时你不想简单地替换或删除字符串。有时你想要提取和处理匹配。这是一个如何操作匹配的示例。

什么是匹配?当为字符串中的整个正则表达式找到兼容的子字符串时,exec 命令会产生匹配。匹配是一个数组,首先是匹配的整个子字符串和匹配中的所有括号。

想象一下 html 字符串:

<html>
<head></head>
<body>
  <h1>Example</h1>
  <p>Look a this great link : <a href="https://stackoverflow.com">Stackoverflow</a> http://anotherlinkoutsideatag</p>
  Copyright <a href="https://stackoverflow.com">Stackoverflow</a>
</body>

你想要提取并获取 a 标记内的所有链接。首先,这里是你写的正则表达式:

var re = /<a[^>]*href="https?:\/\/.*"[^>]*>[^<]*<\/a>/g;

但是现在,想象一下你想要每个环节的 hrefanchor。你想要它在一起。你只需为每个匹配添加一个新的正则表达式,或者你可以使用括号:

var re = /<a[^>]*href="(https?:\/\/.*)"[^>]*>([^<]*)<\/a>/g; 
var str = '<html>\n    <head></head>\n    <body>\n        <h1>Example</h1>\n        <p>Look a this great link : <a href="https://stackoverflow.com">Stackoverflow</a> http://anotherlinkoutsideatag</p>\n\n        Copyright <a href="https://stackoverflow.com">Stackoverflow</a>\n    </body>\';\n';
var m;
var links = [];

while ((m = re.exec(str)) !== null) {
    if (m.index === re.lastIndex) {
        re.lastIndex++;
    }
    console.log(m[0]); // The all substring
    console.log(m[1]); // The href subpart
    console.log(m[2]); // The anchor subpart

    links.push({
      match : m[0],   // the entire match
      href : m[1],    // the first parenthesis => (https?:\/\/.*)
      anchor : m[2],  // the second one => ([^<]*)
    });
}

在循环结束时,你有一个与 anchorhref 的链接数组,你可以用它来写降价,例如:

links.forEach(function(link) {
  console.log('[%s](%s)', link.anchor, link.href);
});

更进一步:

  • 嵌套括号