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

Tau*_*ren 2 javascript regex

我正在尝试使用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
Run Code Online (Sandbox Code Playgroud)

这是规则:

  • 从域中删除子域,除非子域以字符"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
Run Code Online (Sandbox Code Playgroud)

前两个失败,后两个失败.有什么建议?

这里的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';
  }
}
Run Code Online (Sandbox Code Playgroud)

Wis*_*guy 5

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

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

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

这是细分:它可以匹配dev某些东西.,也可以匹配任何东西.如果它与包含"dev"的模式匹配,$1则将包含"dev" $2并将包含".".如果不匹配包含"开发"的模式,$1$2将是空的.($3在任何一种情况下都将包含"mydomain.com".)

所以这是可能的,但这是令人费解的.

我的建议是做一些比这更具可读性和可维护性的东西.在我看来,花费时间和精力来计算这一行不值得保存一两行代码长度.

  • @jahroy有点傻傻的说,"这是你的答案,现在请不要使用它." 大声笑 (3认同)