RegEx:不同的首字母格式

时间:2017-04-25 08:04:59

标签: javascript regex

我正在使用这段代码来获取此人姓名的首字母:

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”...

欢迎任何其他解决方案!

6 个答案:

答案 0 :(得分:3)

尝试使用Array#split()substring()Array#map

  1. 首先你需要用空格分割字符串。
  2. 使用sustring获取单个字母array[n-1]
  3. 然后在数组
  4. 的最后一个参数上获得3个字母
  5. 地图函数迭代字符串的每个单词
  6. 
    
    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;
    &#13;
    &#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)

&#13;
&#13;
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;
&#13;
&#13;

相关问题