繁体   English   中英

收缩时仅将首字母大写

[英]capitalizing only first letter in a contraction

我的挑战是将字符串中每个单词的首字母大写,同时确保所有其他字母均为小写。 我花了更多时间,然后我愿意承认这一点,我的代码如下所示。 大约完成了95%。

唯一的缺陷是它会将像“我”这样的收缩返回为“我”。 由于某种原因,它把收缩视为两个单独的词。 我在大写第一个字母的步骤之后立即放置了console.log进行了测试(在示例中已将其注释掉)。 它返回在同一步骤中将“ I”和“ M”都大写。 我如何获得仅更改“ I”的内容?

function titleCase(str) {

  str = str.toLowerCase(); //make everything lowercase
  str = str.split(" "); //make the string to array

  for(i = 0; i < str.length; i++){
    var strItem = str[i]; //take item in array
    strItem = strItem.replace(/\b./g, function(m){ return m.toUpperCase(); }); //capitalize it
   //console.log(strItem);
   str[i] = strItem; //put changed item back into array
  }

  str = str.join(" "); //turn array back into string
  return str;
}

titleCase("I'm a little tea pot");

感谢您的时间。

我的建议是,您使用<string>.charAt(<index>)来获取字符串的第一个字母,而<string>.slice(<index>)可以给您一部分字符串。

提示:提取每个单词后,可以使用charAt()提取第一个字母,将其大写,然后将字符串的其余部分切成小写。

更新:

回答:

 function upperFirstLetterInWords(str) { var totalString = ""; //Take words from sentence - //Use regex /\\s+/g for many spaces in sentence. var words = str.split(" "); //Take each word... //Using for loop as we have an array and it is //more efficient than foreach loop or lambda. for(var i = 0; i < words.length; ++i) { //Make your changes here.javascript:; totalString += words[i].charAt(0).toUpperCase() + words[i].slice(1).toLowerCase() + " "; } //Remove last space. return totalString.trim(); } console.log(upperFirstLetterInWords("I'm A LitTle TEa POt.")); 

您的问题似乎是在替换表达式中使用了全局匹配。

取下g

 function titleCase(str) { str = str.toLowerCase(); // Make everything lowercase str = str.split(/\\s+/); // Make the string to array for (var i = 0; i < str.length; i++) { var strItem = str[i]; // Take item in array strItem = strItem.replace(/\\b./, function(m) { return m.toUpperCase(); // Capitalize it } ); str[i] = strItem; // Put changed item back into array } return str.join(" "); // Turn array back into string } document.body.innerHTML = titleCase("I'm a little tea pot"); 

您可以创建一个capitalCase函数并将其用作每个单词的映射(回调)函数。

 function titleCase(str) { return str.split(/\\s+/).map(captitalCase).join(' '); } function captitalCase(str) { return str.charAt(0).toUpperCase() + str.substring(1).toLowerCase(); } document.body.innerHTML = titleCase("I'm a little tea pot"); 

保留空白

如果你想保留空白,可以替代所有的序列非空白字符各自的capitalCase等同。

 function titleCase(str) { return str.replace(/(\\S+)/g, function(m) { return captitalCase(m); }); } function captitalCase(str) { return str.charAt(0).toUpperCase() + str.substring(1).toLowerCase(); } document.body.innerHTML = titleCase("I'm a little \\n tea pot"); 
 body { white-space: pre; } 

出于好奇,我想看看是否可以在不使用正则表达式的情况下提出另一种javascript解决方案:

 var selectedParagraph = document.getElementsByTagName('p')[1]; var textUC = []; function toTitleCase(element) { var textLC = element.innerHTML.toLowerCase().split(' '); for (var i = 0; i < textLC.length; i++) { textUC[i] = textLC[i].substr(0,1).toUpperCase() + textLC[i].substr(1);} element.innerHTML = textUC.join(' '); } window.onload = toTitleCase(selectedParagraph); 
 <p>I'm a little tea pot</p> <p>I'm a little tea pot</p> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM