我正在使用这段代码来获取此人姓名的首字母:
var name = "John Smith"; // for an example
var initials = name.match(/\b\w/g) || [];
initials = ((initials.shift() || '') + (initials.pop() || '')).toUpperCase();
// initials then returns "JS"
现在我需要我的首字母来返回名字的第一个字母和姓氏的三个字母(上例中的“JSMI”)。
为了做到这一点,我应该在我的正则表达式中改变什么?
此外,如果一个人有两个名字(例如“John Michael Smith”),我需要得到“JMSMI”...
欢迎任何其他解决方案!
答案 0 :(得分:3)
尝试使用Array#split()
,substring()
和Array#map
array[n-1]
,
function reduce(a){
var c= a.split(" ");
var res = c.map((a,b) => b < c.length-1 ? a.substring(0,1) : a.substring(0,3))
return res.join("").toUpperCase()
}
console.log(reduce('John Michael Smith'))
console.log(reduce('John Smith'))
&#13;
答案 1 :(得分:2)
使用substr()
和function get_initials(name) {
var parts = name.split(" ");
var initials = "";
for (var i = 0; i < parts.length; i++) {
if (i < (parts.length - 1)) {
initials += parts[i].substr(0, 1);
} else {
initials += parts[i].substr(0, 3);
}
}
return initials.toUpperCase();
}
console.log(get_initials("John Michael Smith"));
轻松完成此操作。
更新了代码以反映中间的首字母等
{{1}}
答案 2 :(得分:2)
您可以在开头添加\b\w{1,3}(?=\w*$)
替代现有正则表达式,以匹配字符串最后一个单词中的1到3个字符字符。
var name = "John Michael Smith"; //John Smith" => JSMI
var res = name.match(/\b\w{1,3}(?=\w*$)|\b\w/g).map(function (x) {return x.toUpperCase()}).join("");
console.log(res);
请参阅regex demo。
正则表达式详情:
\b
- 领先的单词边界\w{1,3}
- 1到3个字符(ASCII字母,数字或_
)(?=\w*$)
- 一个积极的前瞻,需要0 +字的字符,然后是字符串位置的结尾|
- 或\b\w
- 单词开头的单词char。我试图避免捕获组(并使用正向前瞻)来制作必要的JS代码,以便对结果进行更短的后期处理。
答案 3 :(得分:1)
我的两分钱用减速器:)
function initials(name) {
return name.split(' ').reduce(function(acc, item, index, array) {
var chars = index === array.length - 1 ? 3 : 1;
acc += item.substr(0, chars).toUpperCase();
return acc;
}, '')
}
console.log(initials('John'));
console.log(initials('John Michael'));
console.log(initials('John Michael Smith'));
答案 4 :(得分:1)
您可能希望使用String.prototype.replace
删除以下字母:
此正则表达式将匹配单词中的前1个(或姓氏3个)字母,并且只保留它。
'John Smith'.replace(/(?:(\w)\w*\s+)|(?:(\w{3})\w*$)/g, '$1$2').toUpperCase()
答案 5 :(得分:0)
const name = "John Michael Smith";
const initials = name.toUpperCase().split(/\s+/)
.map((x, i, arr) => x.substr(0, i === arr.length - 1 ? 3 : 1))
.join('');
console.log(initials);
&#13;