JavaScript RegEx部分匹配/返回仅匹配一个组的值

时间:2016-02-05 08:15:44

标签: javascript regex

让我用一个例子来解释我的问题。假设我们有一个RegEx来匹配一个人的头衔和名称,我们将RegEx定义为

/(Mr|Mdm|Madam|Ms|Miss|Dr\.?)\s+([A-Z][a-z]+\s){1,4}/gm;

如果我们将其与长文本匹配

I spoke to Mr John Smith and he would like to refer me to Dr Baska

RegEx将返回两个匹配的条目

  • 约翰史密斯先生
  • Baska博士

我的问题是如何使string.match(RegEx)只返回一个没有标题的名字数组?

  • John Smith
  • 沐浴

更新

我看到documentation about group operator () in MDN提到使用\1\2等来记住群组,但在语法上不确定这是否可以用于上述目的。

2 个答案:

答案 0 :(得分:2)

您可以使用RegExp.execwhile循环来获取人员姓名。要获取名称,您可以使用捕获组。



var regex = /(Mr|Mdm|Madam|Ms|Miss|Dr)\.?\s+(([A-Z][a-z]+\s?){1,4})/g;
var str = "I spoke to Mr John Smith and he would like to refer me to Dr Baska";

// Declare array to store results
var persons = [];

while(match = regex.exec(str)) {
  // Trim the person name and add in the array
  persons.push(match[2].trim());
}

console.log(persons);
document.body.innerHTML = '<pre>' + JSON.stringify(persons, 0, 2) + '</pre>';
&#13;
&#13;
&#13;

我还在RegEx中进行了一些更改,以匹配和捕获人名。

RegEx101 Demo

/(Mr|Mdm|Madam|Ms|Miss|Dr)\.?\s+((?:[A-Z][a-z]+\s?){1,4})/
                          ^^^                             : Made it common for all and optional
                                ^                       ^ : To capture complete name
                                 ^^^             ^^       : Made the non-capturing group and last space optional

以下正则表达式也可以与第一个捕获组一起使用。

RegEx101 Demo

(?:Mr|Mdm|Madam|Ms|Miss|Dr)\.?\s+((?:[A-Z][a-z]+\s?){1,4})

答案 1 :(得分:1)

Javascript正则表达式不支持lookbehinds。因此,您必须提取组或之后进行一些处理:

var sentence = 'I spoke to Mr John Smith and he would like to refer me to Dr Baska';
var nameFinder = /(Mr|Mdm|Madam|Ms|Miss|Dr\.?)\s+([A-Z][a-z]+\s?){1,4}/gm;

sentence.match(nameFinder).map(function(name) {
    return name.replace(/^\S+\s/, '').trim();
}); // => ["John Smith", "Baska"]