字符串中的大写字母

时间:2019-03-04 17:16:42

标签: javascript string function for-loop

我想创建一个替换字母大写的函数。例如,Hello World将变为HeLlO wOrLd。字符串的第一个字母必须始终大写。

这是我编写的代码:

function alternatingCaps(str) {
    let alternate = str.charAt(0).toUpperCase();
    for(let i = 1; i < str.length; i++) {
        let previousChar = str.charAt(i - 1);
        if(previousChar === previousChar.toUpperCase())
            alternate += str.charAt(i).toLowerCase();
        else if(previousChar === previousChar.toLowerCase())
            alternate += str.charAt(i).toUpperCase();
    }
    return alternate;
}

我用提供的字符串的首字母大写声明了alternate变量。然后,我遍历字符串的其余部分,并检查当前迭代之前的字符是大写还是小写;无论哪种情况,当前字母都将变为相反。

但是,这没有理想的结果。这是一些测试及其相应的结果:

console.log(alternatingCaps('hello world'));
// Output: "HELLO wORLD"

console.log(alternatingCaps('jAvaScrIPT ruLEZ'));
// Output: "JAvAScRIpt rULez"

如何修复我的功能?

4 个答案:

答案 0 :(得分:1)

let s = 'hello there this is a test';
s = s.split('').map( (letter,i) => (i % 2) == 0 ?  letter.toUpperCase() : letter.toLowerCase() ).join('')
console.log( s );

更新:如果您想忽略但保留空格,那么这是另一种解决方案,尽管有些棘手。它不仅忽略空格,还对匹配正则表达式的字母进行操作

let s = 'hello there this is a test';
let ul = false;
s = s.split('').map(letter => letter.match(/[a-zA-Z]/) != null ? (ul = ! ul, ul ? letter.toUpperCase() : letter.toLowerCase()) : letter).join('');
console.log( s );

答案 1 :(得分:0)

我能想到的最简单的解决方案是使用for循环和Remainder运算符。

let alterNate = (input) => {
  let str = ''
  let last = 'L'
  for(let i=0; i<input.length; i++){
   if( /[a-z]/ig.test(input[i]) ) {
      if(last==='L'){
        str+= input[i].toUpperCase()
        last = 'U'
      } else{
        str+= input[i].toLowerCase()
        last = 'L'
      }
   } else {
    str+=input[i]
   }
  }
  return str;
}

console.log(alterNate('hello world'))

答案 2 :(得分:0)

我的解决方案使用RegEx replace来达到预期的结果:

function alternatingCaps(str) {
    return str.replace(/\w(.|$)/g, s => s[0].toUpperCase() + (s[1] ? s[1].toLowerCase() : ''));
}

console.log(alternatingCaps('hello world'));

console.log(alternatingCaps('jAvaScrIPT ruLEZ'));

有两件事要注意:

  • \w(.|$)-此正则表达式捕获单词字符(\w)和后面的任何其他字符。 (.|$)地址中包含奇数个字符。我们基本上是在这里成对捕获字符;
  • s => s[0].toUpperCase() + (s[1] ? s[1].toLowerCase() : '')-此替换功能完成其余工作:
    • s[0].toUpperCase()-需要s[0]并将其更改为大写;
    • (s[1] ? s[1].toLowerCase() : '')-它需要s[1](如果存在)并将其更改为小写。

答案 3 :(得分:0)

这是交替大小写的示例正则表达式

digraph "toto" {
graph ["rankdir"="TB"]
node ["shape"="box"]
"BROUILLON" ["label"="Brouillon","margin"="0.4,0.0"]
"A_VALIDER_RH" ["label"="À valider par la RH","margin"="0.4,0.0","color"="red"]
"A_VALIDER_RH" -> "BROUILLON" ["label"="Refuser"]
"BROUILLON" -> "A_VALIDER_RH" ["label"="Soumettre"]
}

https://regex101.com/r/UPHRUk/1