2013-02-26 75 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