JavaScript将字符串中的所有元音替换为UpCase?

时间:2014-05-30 18:45:21

标签: javascript regex

再次成为JavaScript的新手,并从Ruby / Python过来,所以我觉得JS是一个很好的面孔,但我仍然致力于掌握它。我想将所有vowels替换为vowels.toUpperCase()

示例1 我尝试使用map,但我无法理解如何传递当前迭代的索引:

function vowelToUpCase(idx){
    if(vowel.test(new_arr[idx])) {
        new_arr[idx] = new_arr[idx].toUpperCase();
    }
}

new_arr.map(vowelToUpCase(idx));
new_arr.join('');


示例2 无论如何,我认为这可以通过一些简单的strregex上轻松完成,我认为错了,因为我坚持你在下面看到的内容。

var new_arr = [ 'e', 'i', 'f', 'm', 'e', 'm', 'p', '*', '3' ];
var vowel = /[aeiou]/gi;
var str = new_arr.join('');
console.log(str);

str.replace(/([aeiou])/gi, function (match) { 
    var str = match.toUpperCase();
    console.log(str);
});
console.log(str);

输出:

eifmemp*3
E
I
E
eifmemp*3

期望的输出:

EIfmEmp*3

问题:

  1. 您可以将索引传递给map()函数吗?
  2. 我的str.replace示例有什么问题?

4 个答案:

答案 0 :(得分:4)

两个基本问题:

  1. .replace()没有替换字符串,它会返回一个新值(所以我们需要str = str.replace();

  2. 替换回调函数需要成功替换返回值。

  3. 最终代码:

    str = str.replace(/([aeiou])/g, function (match) { 
        return match.toUpperCase();
    });
    
    console.log(str);
    // EIfmEmp*3
    

    注意:我从正则表达式中删除了i修饰符,因为任何大写字母都已经是大写的。这样可以在非常次要范围内保存性能(因为我们赢了E.toUpperCase();,因为它已经是大写的。)


    要解决@ mplungjan的评论,no..regex在替换中无法做任何逻辑。它可以引用事物并用静态内容替换匹配。但是,匹配的任何修改都需要使用您选择的语言的回调函数来完成。我们可以进行5次单独的替换调用:

    str = str.replace(/a/g, 'A');
    str = str.replace(/e/g, 'E');
    str = str.replace(/i/g, 'I');
    str = str.replace(/o/g, 'O');
    str = str.replace(/u/g, 'U');
    
    console.log(str);
    // EIfmEmp*3
    

    虽然5 simple replacements更快,但我更喜欢代码可读性;)

答案 1 :(得分:1)

对于您的地图问题:

var new_arr = [ 'e', 'i', 'f', 'm', 'e', 'm', 'p', '*', '3' ];

function vowelToUpCase(value, index, originalArray) {
    if(/[aeiou]/.test(value)) {
        return value.toUpperCase();
    }
    return value;
}

var fixed = new_arr.map(vowelToUpCase); // adding params here is bad
console.log(fixed.join(""));

答案 2 :(得分:0)

这是一个有效的例子: CodePen

希望这有帮助。

答案 3 :(得分:0)

以下是自定义过滤器的另一个示例。

var array = [ 'e', 'i', 'f', 'm', 'e', 'm', 'p', '3','h','e','l','l','o'];
var result = []
array.forEach(function (e) {
  /[aeiouAEIOU]/.test(e) ? '' : result.push(e);
})
console.log(result)