在Javascript中获取字符串中每个单词的第一个字母

时间:2011-11-26 16:32:26

标签: javascript

如何收集字符串中每个单词的第一个字母,如收到缩写?

String: "Java Script Object Notation"
Wanted result: "JSON"

17 个答案:

答案 0 :(得分:98)

我认为你所寻找的是所提供字符串的首字母缩写。

var str = "Java Script Object Notation";
var matches = str.match(/\b(\w)/g); // ['J','S','O','N']
var acronym = matches.join(''); // JSON

console.log(acronym)


注意: 对于带连字符/撇号的单词Help-me I'm Dieing,这将失败HmImD。如果那不是您想要的,那么空格分割,抓住第一个字母方法可能就是您想要的。

以下是一个简单的例子:

let str = "Java Script Object Notation";
let acronym = str.split(/\s/).reduce((response,word)=> response+=word.slice(0,1),'')

console.log(acronym);

答案 1 :(得分:17)

我认为你可以用

做到这一点
'Aa Bb'.match(/\b\w/g).join('')

说明:获取在非字母数字字符后出现的所有/g字母数字字符\w(即:在单词边界\b之后),放入它们位于包含.match()的数组上,并将所有内容连接到一个字符串.join('')


根据您的想法,您还可以考虑简单地选择所有大写字符:

'JavaScript Object Notation'.match(/[A-Z]/g).join('')

答案 2 :(得分:17)

没有正则表达式的最简单方法

var abbr = "Java Script Object Notation".split(' ').map(function(item){return item[0]}).join('');

答案 3 :(得分:2)

使用 ES6

非常简单
string.split(' ').map(i => i.charAt(0))               //Inherit case of each letter
string.split(' ').map(i => i.charAt(0)).toUpperCase() //Uppercase each letter
string.split(' ').map(i => i.charAt(0)).toLowerCase() //lowercase each letter

这仅适用于空格或.split(' ')方法中定义的任何内容

.split(', ') .split('; ')等。

答案 4 :(得分:2)

要添加到优秀示例中,您可以在ES6中执行此操作

const x = "Java Script Object Notation".split(' ').map(x => x[0]).join('');
console.log(x);  // JSON

这也有效,但请忽略它,我在这里有点疯狂: - )

const [j,s,o,n] = "Java Script Object Notation".split(' ').map(x => x[0]);
console.log(`${j}${s}${o}${n}`);

答案 5 :(得分:2)

使用map(来自函数式编程)

'use strict';

function acronym(words)
{
    if (!words) { return ''; }

    var first_letter = function(x){ if (x) { return x[0]; } else { return ''; }};

    return words.split(' ').map(first_letter).join('');
}

答案 6 :(得分:2)

@BotNet漏洞: 我认为我在经历了3天的正则表达式教程之后解决了它:

==>我是一个动物

(用来捕捉我的m)因为边界这个词,它似乎对我有用。

/(\s|^)([a-z])/gi

答案 7 :(得分:1)

使用ECMAScript 2018标准,现在很容易在JavaScript中获取任何Unicode单词的首字母:

/(?<!\p{L}\p{M}*)\p{L}/gu

此正则表达式可查找任何不带其他可以有变音符号的其他字母开头的Unicode字母(请参阅最后一个\p{L})(请参阅(?<!\p{L}\p{M}*)匹配后的\p{M}*否定式0个或更多变音符号)。请注意,为使Unicode属性类(如u)正常工作,此处必须使用\p{L}标志。

要模拟完全支持Unicode的\b,您需要添加数字匹配模式和连接器标点符号:

/(?<!\p{L}\p{M}*|[\p{N}\p{Pc}])\p{L}/gu

它适用于Chrome,Firefox(自2020年6月30日起),Node.js和大多数其他环境(请参见compatibility matrix here),用于任何自然语言,包括阿拉伯语

快速测试:

const regex = /(?<!\p{L}\p{M}*)\p{L}/gu;
const string = "Żerard Łyżwiński";
// Extracting
console.log(string.match(regex));                        // => [ "Ż", "Ł" ]
// Extracting and concatenating into string
console.log(string.match(regex).join(""))                // => ŻŁ
// Removing
console.log(string.replace(regex, ""))                   // => erard yżwiński
// Enclosing (wrapping) with a tag
console.log(string.replace(regex, "<span>$&</span>"))    // => <span>Ż</span>erard <span>Ł</span>yżwiński

console.log("_Łukasz 1Żukowski".match(/(?<!\p{L}\p{M}*|[\p{N}\p{Pc}])\p{L}/gu)); // => null

答案 8 :(得分:1)

替代1:

您还可以使用此正则表达式返回每个单词的第一个字母的数组

/(?<=(\s|^))[a-z]/gi

(?<=(\s|^))被称为positive lookbehind,可确保我们搜索模式中的元素前面带有(\s|^)


所以,对于您的情况:

// in case the input is lowercase & there's a word with apostrophe

const toAbbr = (str) => {
  return str.match(/(?<=(\s|^))[a-z]/gi)
            .join('')
            .toUpperCase();
};

toAbbr("java script object notation"); //result JSON

(顺便说一句,如果您想了解更多,还有negative lookbehindpositive lookaheadnegative lookahead


替代2:

匹配所有单词,并使用replace()方法将其替换为每个单词的第一个字母,并忽略空格(该方法不会更改您的原始字符串)

// in case the input is lowercase & there's a word with apostrophe    

const toAbbr = (str) => {
  return str.replace(/(\S+)(\s*)/gi, (match, p1, p2) => p1[0].toUpperCase());
};

toAbbr("java script object notation"); //result JSON

// word = not space = \S+ = p1 (p1 is the first pattern)
// space = \s* = p2 (p2 is the second pattern)

答案 9 :(得分:1)

尝试 -

var text = '';
var arr = "Java Script Object Notation".split(' ');
for(i=0;i<arr.length;i++) {
    text += arr[i].substr(0,1)
}    
alert(text);

演示 - http://jsfiddle.net/r2maQ/

答案 10 :(得分:0)

使用reduce函数的另一个选项:

var value = "Java Script Object Notation";

var result = value.split(' ').reduce(function(previous, current){
    return {v : previous.v + current[0]};
},{v:""});


$("#output").text(result.v);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<pre id="output"/>

答案 11 :(得分:0)

JavaScript的正则表达式版本与早于ECMAScript 6的Unicode不兼容,因此对于那些想要支持“å”等字符的人来说,需要依赖非正则版本的脚本。

在版本6上的事件时,您需要使用\ u。

指示Unicode

更多详情:https://mathiasbynens.be/notes/es6-unicode-regex

答案 12 :(得分:0)

这应该这样做。

var s = "Java Script Object Notation",
    a = s.split(' '),
    l = a.length,
    i = 0,
    n = "";

for (; i < l; ++i)
{
    n += a[i].charAt(0);
}

console.log(n);

答案 13 :(得分:0)

这与其他类似,但是(恕我直言)有点容易阅读:

const getAcronym = title =>
  title.split(' ')
    .map(word => word[0])
    .join('');

答案 14 :(得分:0)

ES6 缩小方式:

const initials = inputStr.split(' ').reduce((result, currentWord) => 
    result + currentWord.charAt(0).toUpperCase(), '');
alert(initials);

答案 15 :(得分:0)

如果您是来这里寻找如何支持使用代理对的非BMP字符的,请执行以下操作:

initials = str.split(' ')
              .map(s => String.fromCodePoint(s.codePointAt(0) || '').toUpperCase())
              .join('');

在没有polyfill(但不是IE)的所有现代浏览器中均可使用

答案 16 :(得分:0)

这个怎么样:

var str = "", abbr = "";
str = "Java Script Object Notation";
str = str.split(' ');
for (i = 0; i < str.length; i++) {
    abbr += str[i].substr(0,1);
}
alert(abbr);

<强> Working Example.