使用JavaScript转换文本字符串



我正在编写一个代码,将一串文本转换为一个句子大小写,这也将保留首字母缩略词。我确实在StackOverflow上浏览了类似的帖子,但是,我找不到一个符合我要求的。

我已经完成了首字母缩略词和句子首字母的转换。然而,我遇到了其他问题,比如句子中的一些字母仍然是大写的,特别是在双引号(")和驼鹿字体

下面是我目前正在处理的代码,我需要有人来帮助我优化代码并解决问题。

String.prototype.toSentenceCase = function() {
var i, j, str, lowers, uppers;
str = this.replace(/(^w{1}|.s*w{1})/gi, function(txt) {
return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
});

// Certain words such as initialisms or acronyms should be left uppercase
uppers = ['Id', 'Tv', 'Nasa', 'Acronyms'];
for (i = 0, j = uppers.length; i < j; i++)
str = str.replace(new RegExp('\b' + uppers[i] + '\b', 'g'),
uppers[i].toUpperCase());
// To remove Special caharacters like ':' and '?'
str = str.replace(/[""]/g,'');
str = str.replace(/[?]/g,'');
str = str.replace(/[:]/g,' - ');
return str;
}
输入>这是一个"字符串"。文本,需要转换为句子大小写的同时保留首字母缩略词,就像Nasa一样。

电流输出:玩周围-这是一个字符串的文本,需要转换为句子的情况下,同时保持首字母缩略词,因为它是像NASA。

预期输出: Play around -这是一串文本,需要将其转换为句子大小写,同时保留首字母缩写,就像NASA一样。

这是初始代码的可运行版本(我稍微修改了输入字符串):

String.prototype.toSentenceCase = function() {
var i, j, str, lowers, uppers;
str = this.replace(/(^w{1}|.s*w{1})/gi, function(txt) {
return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
});

// Certain words such as initialisms or acronyms should be left uppercase
uppers = ['Id', 'Tv', 'Nasa', 'Acronyms'];
for (i = 0, j = uppers.length; i < j; i++)
str = str.replace(new RegExp('\b' + uppers[i] + '\b', 'g'),
uppers[i].toUpperCase());
// To remove Special caharacters like ':' and '?'
str = str.replace(/[""]/g,'');
str = str.replace(/[?]/g,'');
str = str.replace(/[:]/g,' - ');
return str;
}
const input = `play around: This is a "String" Of text, which needs to be cONVERTED to Sentence Case at the same time keeping the Acronyms as it is like Nasa. another sentence. "third" sentence starting with a quote.`
const result = input.toSentenceCase()
console.log(result)


我遇到了其他问题,比如句子中的一些字母仍然是大写的,特别是在双引号(")和驼鹿字体

一些字母仍然大写,因为你没有在代码的任何地方调用.toLowerCase()。除了开头,regex只针对句子的首字母,而不是其他字母。

首先将所有字母小写,然后将一些字母(首字母缩写词和句子的首字母)大写可能会很有帮助。那么,让我们在开始时调用.toLowerCase():

String.prototype.toSentenceCase = function() {
var i, j, str, lowers, uppers;
str = this.toLowerCase();
// ...
return str;
}

接下来,让我们看一下这个正则表达式:

/(^w{1}|.s*w{1})/gi

不需要括号,因为在replacer函数中不使用捕获组。{1}量词也不需要,因为默认情况下w只匹配一个字符。所以我们可以这样简化正则表达式:

/^w|.s*w/gi

这个正则表达式从输入字符串中找到两个匹配项:

  • p
  • . a

两个匹配只包含一个字母(w),因此在replacer函数中,我们可以安全地调用txt.toUpperCase()而不是当前更复杂的表达式(txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase())。我们也可以使用箭头函数:

String.prototype.toSentenceCase = function() {
var i, j, str, lowers, uppers;
str = this.toLowerCase();
str = str.replace(/^w|.s*w/gi, (txt) => txt.toUpperCase());
// ...
return str;
}

然而,第三个句子的首字母不是大写的,因为该句子以引号开头。因为我们无论如何都要删除引号和问号,所以我们在开头删除。

让我们也简化和组合正则表达式:

// Before
str = str.replace(/[""]/g,'');
str = str.replace(/[?]/g,'');
str = str.replace(/[:]/g,' - ');
// After
str = str.replace(/["?]/g,'');
str = str.replace(/:/g,' - ');

:

String.prototype.toSentenceCase = function() {
var i, j, str, lowers, uppers;
str = this;
str = str.toLowerCase();
str = str.replace(/["?]/g,'');
str = str.replace(/:/g,' - ');
str = str.replace(/^w|.s*w/gi, (txt) => txt.toUpperCase());
// ...
return str;
}

现在第三个句子的首字母正确大写了。这是因为当我们将首字母大写时,第三句不再以引号开始(因为我们已经删除了引号)。

剩下的是大写字母缩写。在您的正则表达式中,您可能还希望使用i标志来进行不区分大小写的匹配。

不使用for循环,可以使用单个regex查找所有匹配并将其大写。这样我们就可以去掉大部分的变量。像这样:

String.prototype.toSentenceCase = function() {
var str;
str = this;
str = str.toLowerCase();
str = str.replace(/["?]/g,'');
str = str.replace(/:/g,' - ');
str = str.replace(/^w|.s*w/gi, (txt) => txt.toUpperCase());
str = str.replace(/b(id|tv|nasa|acronyms)b/gi, (txt) => txt.toUpperCase());
return str;
}

看起来我们现在得到了正确的结果!

还有三件事:

  1. 我们可以修改this,而不是创建和改变str变量,并链接方法调用。
  2. txt变量重命名为match变量可能是有意义的,因为它们是正则表达式匹配。修改内置对象的原型是一个坏主意。创建一个新函数是个更好的主意。

最后的代码:

function convertToSentenceCase(str) {
return str
.toLowerCase()
.replace(/["?]/g, '')
.replace(/:/g, ' - ')
.replace(/^w|.s*w/gi, (match) => match.toUpperCase())
.replace(/b(id|tv|nasa|acronyms)b/gi, (match) => match.toUpperCase())
}
const input = `play around: This is a "String" Of text, which needs to be cONVERTED to Sentence Case at the same time keeping the Acronyms as it is like Nasa. another sentence. "third" sentence starting with a quote.`
const result = convertToSentenceCase(input)
console.log(result)

最新更新