2

我正在尝试提出一个 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,但我希望将它组合成一个正则表达式替换命令。请注意,我还想保留在 dmain 末尾指定的任何端口。

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';
  }
}
4

3 回答 3

7

只是为了表明可以在单个正则表达式中执行:

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

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

这是细分:它要么匹配devsomething.,要么匹配任何东西。如果它与包含“dev”的模式匹配,$1则将包含“dev”并$2包含“.”。如果它与包含“dev”的模式不匹配,则为$1$2。($3在任何一种情况下都将包含“mydomain.com”。)

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

我的建议是做一些比这更具可读性和可维护性的事情。在我看来,花在弄清楚这一行上的时间和痛苦不值得节省一两行代码长度。

于 2013-02-26T02:50:45.423 回答
2

您可以在替换中使用函数在 JS 中通过更多控制来修改值。

var value = "dev-foo.mydomain.com".replace(/^(dev)?[^\.]+\./, function (match, p1) {
    return p1 ? p1 + '.' : '';
});
于 2013-02-26T02:26:27.417 回答
1

很难说出你想要什么...

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

  1. 在第一个周期拆分输入。
  2. 如果第一部分包含单词“dev”,则将其替换为“dev”。
  3. 如果第一部分不包含单词 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);
    }
}

如果这不是您想要的,请更新您的问题以指定您想要的内容。

于 2013-02-26T02:10:46.613 回答