Javascript RegEx替换有条件地删除字符串的一部分

Javascript RegEx replace to conditionally remove part of a string

本文关键字:字符串 一部分 删除 RegEx 替换 有条件 Javascript      更新时间:2023-09-26

我试图想出一个Javascript RegEx命令,将这些输入转换为以下输出:

INPUT                      DESIRED OUTPUT
mydomain.com          -->  mydomain.com
foo.mydomain.com      -->  mydomain.com
dev.mydomain.com      -->  dev.mydomain.com
dev-foo.mydomain.com  -->  dev.mydomain.com

规则如下:

  • 从域中删除子域,除非子域以"dev"字符开头
  • 如果子域名以"dev"开头,则输出"dev.domain.com"
  • 保留域末尾指定的任何端口

我的正则表达式技能失败了。这是我目前所看到的:

'mydomain.com'.replace(/^(dev)?(-.*)?(mydomain.com)/,'$1.$3'); 
// .mydomain.com
'foo.mydomain.com'.replace(/^(dev)?(-.*)?(mydomain.com)/,'$1.$3'); 
// foo.mydomain.com
'dev-foo.mydomain.com'.replace(/^(dev)?(-.*)?(mydomain.com)/,'$1.$3'); 
// dev.mydomain.com
'dev.mydomain.com'.replace(/^(dev)?(-.*)?(mydomain.com)/,'$1.$3'); 
// dev.mydomain.com

前两个失败,后两个成功。有什么建议吗?

这里的javascript工作,但我希望把它合并成一个单一的regex替换命令。请注意,我还希望保留域末尾指定的任何端口。

var getHost = function () {
  var host = window.location.host;
  if (host.substring(0,3) === 'dev') {
    return host.replace(/^(dev)?(-.*)?(mydomain'.com.*)/,'$1.$3');
  }
  else {
    return 'mydomain.com';
  }
}

只是为了展示在单个正则表达式中可以做到:

'string'.replace(/(?:(^dev).*('.)|^.*)(mydomain'.com)/, '$1$2$3');

工作示例:http://jsfiddle.net/gz2tX/

下面是分解:它要么匹配dev 某些 .,要么匹配任何。如果匹配"dev",则$1包含"dev",$2包含"。"。如果它不匹配包含"dev"的模式,$1$2将为空。($3在任何情况下都将包含"mydomain.com")

所以这是可能的,但它是复杂的

我的建议是做一些比这更具可读性和可维护性的东西。在我看来,计算这一行所花费的时间和痛苦是不值得节省一两行代码长度的。

你可以使用一个函数来修改值,在JS中有更多的控制权。

var value = "dev-foo.mydomain.com".replace(/^(dev)?[^'.]+'./, function (match, p1) {
    return p1 ? p1 + '.' : '';
});

很难知道你在要求什么…

但是…根据您的示例输入/输出,您可以执行以下操作:

  1. 分割第一个周期的输入。
  2. 如果第一部分包含"dev",则将其替换为"dev"。
  3. 如果第一部分NOT包含dev这个词,删除它。

不需要正则表达式,如果实际上是你想要的:

function trimInput(s) {
    var n = s.indexOf('.');
    if (n === -1) {
        return s;
    }
    var head = s.substring(0, n);
    if (head.indexOf("dev") !== -1) {
        return "dev." + s.substring(n);
    }
    else {
        return s.substring(n);
    }
}

如果不是想要你想要的,请更新你的问题,指定你想要的