2013-02-26 72 views
2

我试图想出一个Javascript正则表达式的命令,将这些输入转换成以下输出的一部分:的Javascript正则表达式替换有条件地去除串

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'; 
    } 
} 
+1

你能解释一下这里应该适用的一般规则吗?根据您的示例输入/输出,人们可能会认为您正在寻找一种方法来删除连字符,句点和单词foo,当它们出现在第一个句点之前时。那是你要的吗? – jahroy 2013-02-26 02:07:04

+1

你能解释一下你想让你的正则表达式工作吗?所以它需要一个形式为'mydomain.com'或'(something).mydomain.com'的字符串,并且应该总是返回'mydomain.com',*除非*'(something)'包含单词'dev',否则哪种情况应该是'dev.mydomain.com'?或者你只是想删除任何'foo'的发生? – 2013-02-26 02:07:22

+0

@jahroy我已经更新了使用规则的问题。也许你可以撤销downvote? – Tauren 2013-02-26 02:25:42

回答

5

只是为了表明这是可能的一个正则表达式做的目的:

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

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

这里的故障:它要么dev东西相匹配.,或者它匹配任何东西。如果它匹配包含“dev”的模式,$1将包含“dev”,并且$2将包含“。”。如果它与包含“dev”的模式不匹配,则$1$2将为空。($3在任何情况下都将包含“mydomain.com”。)

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

我的建议是做一些比这更易于阅读和维护的东西。在我看来,计算出这一行的时间和痛苦并不值得保存一行或两行代码长度。

+0

对于“_do更可读和更可靠”的+1。我没有看到在这里使用正则表达式的好处。 – jahroy 2013-02-26 03:02:09

+0

不错的工作@wiseguy!我完全同意你对可读性和可维护性的看法。但我的问题只是我真正想要做的一个简单例子。在我的情况下,将它封装到单个正则表达式中更有意义。 – Tauren 2013-02-26 03:04:21

+3

@jahroy感觉有点愚蠢的说,“这是你的答案,现在请不要使用它。”大声笑 – Wiseguy 2013-02-26 03:04:25

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); 
    } 
} 

如果这希望你愿意,请更新您的问题,指定你想要什么。

+0

是的,你的描述解释了我想要的。但是我的目标显然并不清楚,因为如果可能的话,我希望将其缩减为单个正则表达式。 – Tauren 2013-02-26 02:33:43

+3

+1感谢您提供可读的答案。在大多数情况下,这将是首选。 – Tauren 2013-02-26 03:05:51

2

你可以使用一个函数来修改JS中的更多控件的值来替换。

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

啊,我想你在这里解决方案。您的代码不适用于'mydomain.com'或'dev.mydomain.com',但我认为这正是我所寻找的。 – Tauren 2013-02-26 02:40:00