Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用正则表达式匹配名称字符串中的首字母,忽略标题_Javascript_Regex - Fatal编程技术网

Javascript 使用正则表达式匹配名称字符串中的首字母,忽略标题

Javascript 使用正则表达式匹配名称字符串中的首字母,忽略标题,javascript,regex,Javascript,Regex,我正在尝试获取名称字符串的首字母缩写,但该字符串可能包含我希望忽略的标题,并且具有多个或单个名称。如何仅在Javascript中使用正则表达式来实现这一点 我可以将字符串中单词的第一个字符与\b(\w)匹配,但我想忽略'Mr'和'Mrs'等。 类似于[^mr]\b(\w),但这会拾取mr中的M和前面的空白,并且不会忽略任何其他标题 字符串和匹配的示例: 'Mr Bob Smith' -> BS 'Miss Jessica Blue' -> JB 'tim white' -> T

我正在尝试获取名称字符串的首字母缩写,但该字符串可能包含我希望忽略的标题,并且具有多个或单个名称。如何仅在Javascript中使用正则表达式来实现这一点

我可以将字符串中单词的第一个字符与
\b(\w)
匹配,但我想忽略'Mr'和'Mrs'等。 类似于
[^mr]\b(\w)
,但这会拾取mr中的M和前面的空白,并且不会忽略任何其他标题

字符串和匹配的示例:

'Mr Bob Smith' -> BS
'Miss Jessica Blue' -> JB
'tim white' -> TW
'dr Lisa S pink' -> LS
'lord Lee Kensington-Smithe' -> LK

我可以用消极的向前看和积极的向后看来解决这个问题。 您可以尝试以下方法:

函数firstChars(str){
const regex=/(?!\bmr\.?\b |\bmiss\b |\blord\b |\bdr\b)((?这对我很有用

(\w)\w+ (\w)\w+$

如果LSP是可接受的,并且标题的大小写变体,则可以使用

let pattern = /\b(?:(?:Mr|Miss|dr|lord)? )?(\w+(?:[ -]\w+)*)\b/i;

let pattern=/\b(?:(?:Mr | Miss | dr | lord)?(\w+(?:[-]\w+*)\b/i;
设字符串=[
“鲍勃·史密斯先生”,
“杰西卡·布鲁小姐”,
“蒂姆·怀特”,
“丽莎博士的粉红色”,
“李·肯辛顿·史密斯勋爵”
];
strings.forEach(s=>{
设m=s.match(模式);
如果(m){
console.log(m[1].split(“”).map(s=>s.charAt(0.toUpperCase()).join(“”);
}

})
我更喜欢多步骤而不是难以解析的正则表达式

# Ignore case
name = "Mr. Frank Smith".lower()

# Get rid of the title 
name = re.sub("^(lord|mrs|mr)[.]? ","", name)

# get each first letter
name_list = name.split(" ")
for n in name_list:
    # might need to exclude III, Jr. etc.
    initials += n[0].upper()
从您的示例中,不清楚您是否还需要中间名或前两个名。例如,根据需要,您可以使用下面的行而不是for循环:

# only first and second name, even if exclude last name
initials = name_list[0][0].upper() + name_list[1][0].upper()

以下是更面向javascript的方法:

var initials = fullNames.map(fullname => {
    return fullname
        .replace(/^(?:Mr|Miss|dr|lord)\.? ?/, '') // remove title
        .split(' ')
        .map(substring => substring[0].toUpperCase())
        .join('')
        .substring(0, 2) // this part is to match only 2 chars
});
// => [ 'BS', 'JB', 'TW', 'LS', 'LK' ]
如果您对
'dr Lisa S pink'==LSP

const全名=[
“鲍勃·史密斯先生”,
“杰西卡·布鲁小姐”,
“蒂姆·怀特”,
“丽莎博士的粉红色”,
“李·肯辛顿·史密斯勋爵”
]
const initials=fullNames.map(fullname=>{
返回全名
.替换(/^(?:先生|小姐|博士|勋爵)\??/,“”)
.拆分(“”)
.map(子字符串=>子字符串[0].toUpperCase())
.加入(“”)
.子字符串(0,2)
})
const initialsV2=fullNames.map(fullname=>{
返回全名
.替换(/^(?:先生|小姐|博士|勋爵)\??/,“”)
.拆分(“”)
.map(子字符串=>子字符串[0].toUpperCase())
.加入(“”)
})
$('#initials').html(fullNames.map((fullName,i)=>`${fullName.padEnd(28',)}=>${initials[i]}')。连接('\n'))
$('#initials2').html(fullNames.map((fullName,i)=>`${fullName.padEnd(28',)}=>${initialsV2[i]}')。连接('\n'))

V1只有2个字母
V2任意字母长度

你想让“Lisa S pink博士”给你LS,而不是LSP或LP?为什么
tim white
TW?你可以用neagtive向前看,就像这样(?!Mr | Miss | dr | lord)\b(\w)
LSP
对于
Lisa S pink博士来说是可以接受的
不,我的意思是
Lisa S pink博士
必须是
LS
,所以你从来没有遇到过像
William R.Burroughs III.
这样的名字。只是吹毛求疵,但是如果中间缩写的话正则表达式就会失败。看。@collapsar我能想出很多名字和边缘CA但在匹配姓名时,这就是问题所在。中间的首字母几乎不是边缘大小写,尤其是在拼写标题的上下文中:-)@collapsar你可以匹配一个可选的点,
William R.Burroughs III.
将成为
WRBI
对,除非William R.Burroughs III.和William R.Burroughs II.出现在同一组数据中-我很乐意承认这正变得深奥…:-)@C0deJack,试试这个。是的,我认为这将是最接近什么的我不需要。谢谢@SajeebAhamed@C0deJack,您还可以添加带有mr、miss等的可选点(.),如
(mr\.?| miss\.?)