正则表达式分组捕获

7

我有一封标准电子邮件,我想从中提取某些详细信息。

在这封电子邮件中,有以下这样的内容行:

<strong>Name:</strong> John Smith

为了模拟这一点,我有以下JavaScript代码:

var str = "<br><strong>Name:</strong> John Smith<br>";
var re = /\<strong>Name\s*:\<\/strong>\s*([^\<]*)/g
match = re.exec(str);
while (match != null) {
    console.log(match[0]);
    match = re.exec(str);
}

这只会得到一个结果,即:
<strong>Name:</strong> John Smith

我希望能够获取捕获分组 ([^\<]*),在这个例子中应该是 John Smith

我漏掉了什么?


1
强制性链接:https://dev59.com/X3I-5IYBdhLWcg3wq6do。 - T.J. Crowder
1
我已经找到了那个“重复”的答案,那就是我得到测试脚本的地方。 - Graham
2
你需要在答案中往下读一点,他在一个注释中说:“捕获组n:match[n]”。如果我在意识到必须有一个重复目标之前就已经回答了这个问题,我会为了清晰起见添加一个注释,但是这太难以发现了。祝编码愉快! - T.J. Crowder
2个回答

6

在正则表达式中,第一个匹配总是整个匹配的字符串。使用分组时,您从第1组开始匹配,因此要解决您的问题,只需用match [1]替换 match [0] 。

话虽如此,由于您正在使用JavaScript,最好处理DOM本身并从其中提取文本,而不是使用正则表达式处理HTML。


4
捕获组在匹配数组中从索引1开始提供:

var str = "<br><strong>Name:</strong> John Smith<br>";
var re = /\<strong>Name\s*:\<\/strong>\s*([^\<]*)/g
match = re.exec(str);
while (match != null) {
    console.log(match[1]); // <====
    match = re.exec(str);
}

索引0包含完整匹配内容。

在现代JavaScript引擎上,你也可以使用命名捕获组((?<theName>...)),并通过match.groups.theName访问它们:

var str = "<br><strong>Name:</strong> John Smith<br>";
var re = /\<strong>Name\s*:\<\/strong>\s*(?<name>[^\<]*)/g
// ---------------------------------------^^^^^^^
match = re.exec(str);
while (match != null) {
    console.log(match.groups.name); // <====
    match = re.exec(str);
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接