让我用一个例子来解释我的问题。假设我们有一个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将返回两个匹配的条目
我的问题是如何使string.match(RegEx)只返回一个没有标题的名字数组?
更新
我看到documentation about group operator () in MDN提到使用\1
,\2
等来记住群组,但在语法上不确定这是否可以用于上述目的。
答案 0 :(得分:2)
您可以使用RegExp.exec
和while
循环来获取人员姓名。要获取名称,您可以使用捕获组。
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;
我还在RegEx中进行了一些更改,以匹配和捕获人名。
/(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
以下正则表达式也可以与第一个捕获组一起使用。
(?: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"]