js 正则表达式条件替换为捕获的组

js RegEx conditional replace with captured group

本文关键字:正则表达式 条件 替换 js      更新时间:2023-09-26

我正在尝试使用javascript中的正则表达式格式化网址...

输入:http://www.google.comhttps://www.yahoo.com

我正在使用这个正则表达式来捕获/(http':'/'/|https':'/'/){0,1}(.*)/

所以$1说的是http还是https$2 URL的其余部分......

现在我想用 1 替换 http,用 2 替换https,以便输出应如下所示:

1www.google.com2www.yahoo.com

我使用了下面的代码,但它不起作用...

var url = "http://www.microsoft.com";
url.replace(/(http':'/'/|https':'/'/){0,1}(.*)/, ("$1"=="http://"?"1":"2")+"$2");
// output: 2www.microsoft.com
url.replace(/(http':'/'/|https':'/'/){0,1}(.*)/, ("$1"=="http://")+"$2");
// output: falsewww.microsoft.com

有人知道如何做到这一点吗...?? 谢谢...

使用正则表达式的解决方案

var url1= 'http://www.google.com';
var url2= 'https://www.yahoo.com';
url1.replace(/(http':'/'/|https':'/'/){0,1}(.*)/, function (g1,g2,g3) { 
    var prefix =''; 
    if(g2 == 'https://') {
        prefix = '2'
    } else{ 
        prefix='1'
    } 
    return prefix + g3
})
//url1.replace(...) //"1www.google.com"
//url2.replace(...) //"2www.yahoo.com"

您使用的正则表达式不好:它可以匹配字符串中间的http,并且即使不需要,它也尝试匹配整个字符串

改用这个

url.replace(/^http(s)?:'/'//, function(match, secure) {
    return secure ? "2" : "1"
})

url.replace('https','2').replace('http','1')

不知道你为什么要这样做

url.replace(/(http':'/'/|https':'/'/){0,1}(.*)/,function($1, $2, $3) {
    if($2 == 'https://') {
        return "2" + $3
    } else {
        return "1" + $3
    }
});

解释 - 替换功能如何与正则表达式配合使用

replace(<RegEx>, handler)

参数 - $1, $2, $3 ...是正则表达式的结果。正则表达式模式中的每个捕获组都可以使用 $N 表示法在替换字符串中使用,其中"N"是捕获组的索引:

url.replace(/(http':'/'/|https':'/'/){0,1}(.*)/, ("$1"=="http://"?"1":"2")+"$2");

应该可以做到这一点,而无需引入 lambda 函数,并且对现有代码进行最少的修改。 正则表达式的问题在于您捕获了://而不是与之进行比较,并且"http://" == "http"将始终评估为 false。