【问题标题】:Convert upper chars to lower and lower to upper (vice versa) [duplicate]将大写字符转换为小写,将小写转换为大写(反之亦然)[重复]
【发布时间】:2016-02-24 09:29:51
【问题描述】:

我需要将某个字符串中的所有小写字符转换为大写字符,并将所有大写字符转换为小写字符。

例如

var testString = 'heLLoWorld';

应该是

'HEllOwORLD' 

转换后。

在不保存临时字符串的情况下,最优雅的实现方式是什么。

如果使用正则表达式达到这样的结果会更好。

谢谢。

【问题讨论】:

  • 由于 JavaScript 字符串是不可变的,这在技术上是不可能的,你必须至少得到一个额外的字符串(你当然可以将其分配回testString,但额外的字符串仍然存在。 ) 到目前为止,所有答案都以字符串的副本结束,2 有两个副本(一个在数组中,一个在字符串中,在一种情况下,都在第二个数组中),一个在第二个字符串中具有显式副本.
  • 根据原问题答案见this demo

标签: javascript regex replace regexp-replace


【解决方案1】:

这是一个想法:

function flipCase(str) {
  return str.split('').reduce(function(str, char) {
    return str + (char.toLowerCase() === char
      ? char.toUpperCase()
      : char.toLowerCase());
  }, '');
}

【讨论】:

    【解决方案2】:
    testString.split('').map(function(c) {
      var f = 'toUpperCase';
      if(c === c.toUpperCase()) {f = 'toLowerCase';}
      return c[f]();
    }).join('');
    

    【讨论】:

      【解决方案3】:

      这是 RegEx 的一个想法

      var testString = 'heLLoWorld';
      var newString  = '';
      for(var i =0; i< testString.length; i++){
          if(/^[A-Z]/.test(testString[i])){
               newString+= testString[i].toLowerCase();
          } else {
               newString+= testString[i].toUpperCase();
          }
      }
      

      在这里工作示例http://jsfiddle.net/39khs/1413/

      【讨论】:

      • 类似 str.replace(/./g, function(c) { return case-modified or original c; }) 可以说更优雅,这是问题中的要求。
      • 另外,上面的方法对于大写但非 ASCII 字符会失败,例如 'Å' 保持不变,但应该变成 'å'。
      • 这只是一个想法,我对 JS 没有太多经验,但我正在研究您的建议,谢谢。
      【解决方案4】:

      这里有一个正则表达式的解决方案,它利用了大小写字母相差十进制32对应的位:

      var testString = 'heLLo World 123',
          output;
      
      output= testString.replace(/([a-zA-Z])/g, function(a) {
                return String.fromCharCode(a.charCodeAt() ^ 32);
              })
        
      document.body.innerHTML= output;

      【讨论】:

      • ASCII-/基本字母字符串的优雅解决方案,但不适用于 unicode 字符:"Ć".toLowerCase() == "ć"String.fromCharCode("Ć" ^ 32) != "ć"
      • 是的,在 ASCII 8 位时代,生活要简单得多。
      猜你喜欢
      • 2017-01-26
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 2018-02-15
      • 1970-01-01
      相关资源
      最近更新 更多