我自己编写了一个将字符串转换为缩写的函数,它目前相当长,并且区分大小写。
我需要一种缩短它的方法,因此它可以100%的时间工作。目前,如果其中一个分词具有大写字母,如果一个单词以分词结尾,则会搞砸。
我的分词基本上就是我要删除的词(因为大多数公司都不包括它们)。它们包括:
另外,我删除它们的方式是使用拆分和连接(str.split('and ').join('')
),这对我来说似乎不是最简单的方法。
除了这些问题,它运作正常。任何人都可以帮我缩小功能并解决问题吗?感谢。
功能:
String.prototype.toAbbrev = function () {
var s = [];
var a = this.split('and ').join('').split('of ').join('').split('the').join('').split('for ').join('').split('to ').join('').split(' ');
for (var i = 1; i < a.length + 1; i++) {
s.push(a[i - 1].charAt(0).toUpperCase());
}
return s.join('.');
}
经测试公司的输出
The National Aeronautics and Space Administration -> N.A.S.A The National Roads and Motorists' Association -> N.R.M.A Royal Society for the Prevention of Cruelty to Animals -> R.S.P.C.A
答案 0 :(得分:12)
我认为这样的方法可能会更好:
var toAbbrev = function(str){
return str.replace(/\b(?:and|of|the|for|to)(?: |$)/gi,''). // remove all occurances of ignored words
split(' '). // split into words by spaces
map(function(x){
return x.charAt(0).toUpperCase(); // change each word into its first letter capitalized
}).
join('.'); // join with periods
};
这是正则表达式的细分:
/
\b // word boundary
(?:and|of|the|for|to) // non-capturing group. matches and/of/the/for/to
(?: |$) // non-capturing group. matches space or end of string
/gi // flags: g = global (match all), i = case-insensitive
这是另一种方法,它具有不太复杂的正则表达式:
var toAbbrev = function(str){
return str.split(' '). // split into words
filter(function(x){
return !/^(?:and|of|the|for|to)$/i.test(x); // filter out excluded words
}).
map(function(x){
return x.charAt(0).toUpperCase(); // convert to first letter, captialized
}).
join('.'); // join with periods
};
正则表达式分解:
/
^ // start of string
(?:and|of|the|for|to) // non-capturing group. matches and/of/the/for/to
$ // end of string
/i // flags: i = case-insensitive
答案 1 :(得分:8)
更短的一个:
str.replace(/(and|of|the|for|to)( |$)/gi, "").replace(/(.).+?(\s|$)/g, "$1.");
为了确保它是大写的,你可以在最后做.toUpperCase
。
(.) //selects the first character
.+ //matches the rest of the characters
? //? indicates a lazy match
(\s|$) //match a space or the end
$1. //means "the first selected match plus a dot"
让我们把它变成一个正则表达式!
str.replace(/((and|of|the|for|to) )*(.).+?(\s|$)/ig, "$3.");
"Royal Society for the Prevention of Cruelty to Animals"
.replace(/((and|of|the|for|to) )*(.).+?(\s|$)/ig, "$3.");
//R.S.P.C.A
"Josie and the Pussycats"
.replace(/((and|of|the|for|to) )*(.).+?(\s|$)/ig, "$3.");
//J.P.
理论上,这应涵盖所有合法的名称。对于末尾有介词的名字,你可以技术上这样做:
.replace(/((and|of|the|for|to) )*(.).+?(\s|$)((and|of|the|for|to) ?)*/ig, "$3.")
但这显然比有两个replace
的那个更长,这就失去了它的目的。
答案 2 :(得分:4)
你也可以使用reduce来做到这一点。你在做什么本质上是将字符串缩减为缩写 -
str.split(' ').reduce(function(preV, curV, index) {
if(!/^(and|of|the|for|to)$/.test(curV.toLowerCase())) {
return preV + curV.toUpperCase().charAt(0) + '.';
}
return preV;
}, '');
答案 3 :(得分:2)
为什么不试试这样的事呢?
var a=this.replace(/and |of |the |for |to /gi, '').split(' ');
否则剩下的就好了
答案 4 :(得分:2)
只需按以下方式替换字符串:
var a = this.replace(/ and | of | the | for | to /gi, ' ').split(' ');
这也将解决其中一个分裂词位于任何主词结尾的问题。
要删除字符串开头的任何拆分字,只需执行以下操作:
var pos = a.search(/and |of |the |for |to /i);
if (pos == 0)
//remove that word
答案 5 :(得分:2)
使用ECMA5的可能解决方案
的Javascript
var toAbbrev = (function (ignore) {
return function toAbbrev(myString) {
return myString.split(/[^\w]/).reduce(function (acc, word) {
if (word && ignore.indexOf(word.toLowerCase()) === -1) {
acc += word.charAt(0).toUpperCase() + '.';
}
return acc;
}, '');
};
}(['and', 'of', 'the', 'for', 'to']));
console.log(toAbbrev('The Silica & Sand Society'));
console.log(toAbbrev('The National Aeronautics and Space Administration'));
console.log(toAbbrev('The National Roads and Motorists\' Association'));
console.log(toAbbrev('Royal Society for the Prevention of Cruelty to Animals'));
输出
S.S.S.
N.A.S.A.
N.R.M.A.
R.S.P.C.A.
上
您可以改进split
正则表达式(/[^\w]/
)来处理更多奇怪的事情。或者只是在空格/\s/
上拆分并添加到排除列表中。