【问题标题】:Alternate capitalisation in a string字符串中的替代大写
【发布时间】:2019-03-04 17:16:41
【问题描述】:

我想创建一个交替字母大写的函数。例如,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"

如何修复我的功能?

【问题讨论】:

  • alternatingCaps('jAvaScrIPT ruLEZ') 的期望输出是什么?
  • 为什么不直接遍历字符串,为每个非空格字符交替大写和小写?
  • "@AnuragSrivastava JaVaScRiPt RuLeZ
  • @HereticMonkey 这就是我想要做的

标签: javascript string function for-loop


【解决方案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 );

【讨论】:

  • “there”中的“T”应为小写。请参阅 OP 的示例,其中“world”的“w”是小写的。
【解决方案2】:

我能想到的最简单的解决方案是使用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'))

【讨论】:

  • 你需要跳过空格。
  • @adiga 添加了一个更强大的。它只是交替所有字母忽略特殊字符
【解决方案3】:

我的解决方案使用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 =&gt; s[0].toUpperCase() + (s[1] ? s[1].toLowerCase() : '') - 这个替换函数完成了剩下的工作:
    • s[0].toUpperCase() - 需要 s[0] 并将其更改为大写;
    • (s[1] ? s[1].toLowerCase() : '') - 如果存在s[1],则将其更改为小写。

【讨论】:

    【解决方案4】:

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

    [A-Z]([a-z][A-Z])*[a-z]?
    

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

    【讨论】:

      猜你喜欢
      • 2021-08-14
      • 1970-01-01
      • 2015-03-19
      • 2012-09-25
      • 2023-03-21
      • 2016-12-11
      • 2021-05-31
      • 2011-03-01
      • 2021-07-30
      相关资源
      最近更新 更多