美文网首页Web前端之路让前端飞Web 前端开发
如何把一个字符串的大小写取反(大写变小写小写变大写),例如 ’A

如何把一个字符串的大小写取反(大写变小写小写变大写),例如 ’A

作者: 青山旁小溪边 | 来源:发表于2019-10-30 10:10 被阅读0次

问题

如何把一个字符串的大小写取反(大写变小写小写变大写),例如 ’AbC' 变成 'aBc'

答案

答案不是唯一这里我先分享两种方式

1. 正则表达式


'aBc'.replace(/[a-zA-Z]/g,function(a){ return /[a-z]/.test(a)?a.toUpperCase():a.toLowerCase();})});

// "AbC"

2. 循环判断大小写


'aBc'.split('').map((n,i)=>(n === n.toUpperCase() ? n.toLowerCase() : n.toUpperCase())).join('');

// "AbC"

用了3种实现方法处理千万级别长度字符,对比了下时间,分享给大家,for循环+unicode转行相对较快


function getRandomStr() {
    let str = ''
    let arr = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S","T", "U", "V", "W", "X", "Y", "Z","a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t","u", "v", "w", "x", "y", "z"]
    for (let i = 0; i < 10000000; i++) {
        let num = parseInt(Math.random() * 53)
        str += arr[num]
    }
    return str
}
function transformStr() {
    console.time('生成1千万长度字符串用时')
    let str = getRandomStr()
    console.timeEnd('生成1千万长度字符串用时')
    // console.log(str)
    console.time('使用正则替换用时')
    let str1 = str.replace(/./g, (input) => {
        let num = input.charCodeAt(0)
        if (num >= 65 && num <= 90) {
            return String.fromCharCode(num + 32)
        } else {
            return String.fromCharCode(num - 32)
        }
    })
    console.timeEnd('使用正则替换用时')
    // console.log(str)
    console.time('使用for循环耗时')
    let str2 = ''
    for (let i = 0, len = str.length; i < len; i++) {
        let s = str[i]
        let num = s.charCodeAt(0)
        if (num >= 65 && num <= 90) {
            str2 += String.fromCharCode(num + 32)
        } else {
            str2 += String.fromCharCode(num - 32)
        }
    }
    console.timeEnd('使用for循环耗时')
    console.log(str1 === str2)
    console.time('使用toUppercase逐个转换耗时')
    let str3 = ''
    for (let i = 0, len = str.length; i < len; i++) {
        let s = str[i]
        let sUp = s.toUpperCase()
        if (sUp === s) {
            str3 += s.toLocaleLowerCase()
        } else {
            str3 += sUp
        }
    }
    console.timeEnd('使用toUppercase逐个转换耗时')
    console.log(str2 === str3)
    console.time('使用toUppercase转换字符')
}
/*
生成1千万长度字符串用时: 21243.43701171875ms
使用正则替换用时: 1378ms
使用for循环耗时: 1829.082763671875ms
true
使用toUppercase逐个转换耗时: 5212.477783203125ms
 true
*/ 

可能还有其他方式来解决这个问题,欢迎大佬留言,相互学习!

相关文章

网友评论

    本文标题:如何把一个字符串的大小写取反(大写变小写小写变大写),例如 ’A

    本文链接:https://www.haomeiwen.com/subject/dcxovctx.html