2014-10-18 68 views
1

我需要一些正則表達式的幫助。如何從一開始就使正則表達式匹配模式?

我正在從JavaScript以下爲「面具」可使用以下規則組成的所有特殊的URL:

  • 他們可以像這樣的東西0>1223>1_23>

  • 開始
  • 他們可能有協議,前開始:http:\\https:\\

  • 它們也有可能www.子域

因此,例如,對於https://www.example.com應該產生https://www. ...

於是我想出了以下JS:

var url = "0>https://www.example.com/plugins/page.php?href=https://forum.example.com/topic/some_topic"; 
m = url.match(/\b((?:[\d_]+>)?.+\:\/\/(?:www.)?)/i); 
if (m) { 
    url = m[1] + " ..."; 
} 

console.log(url); 

它適用於大多數情況下,除了「重複」的網址在我的例子,在這種情況下,我得到這個:

0 >https://www.example.com/plugins/page.php?href=https:// ......

當我期待:

0> https:// www。 ...

如何讓它從一開始就選擇匹配?我以爲加入\b會做到這一點...

+0

使用非貪婪操作''像這樣'\ B((?:?[\ d _] +>)+ \:??\/\ /(?: www。)?)' – 2014-10-18 02:59:57

+0

@alphabravo:剛剛錯過了一個問號,呵呵;)謝謝。 – c00000fd 2014-10-18 03:04:38

回答

3

那就讓.+,不貪婪,這樣

m = url.match(/\b((?:[\d_]+>)?.+?\:\/\/(?:www.)?)/i); 

注意?.+後。這意味着,正則表達式必須匹配到當前表達式之後的第一個:。如果你不使用?,它會使它變得貪婪,它將消耗所有字符,直到字符串中的最後一個:

而且,您不必轉義:,您必須在www後轉義.。所以,你的正則表達式會變成這個樣子

m = url.match(/\b((?:[\d_]+>)?.+?:\/\/(?:www\.)?)/i); 
+0

欣賞它!這裏沒有關於這個話題,但我一直困惑着什麼,我應該逃避什麼,我不應該在正則表達式中。這是否有一個規則?如果在我不應該的時候我逃避像':'這樣的東西,這是否「壞」? – c00000fd 2014-10-18 03:05:55

+0

@ c00000fd沒問題:-)表中的所有字符[這裏](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Using_Special_Characters)都被認爲是meta-字符。如果你想匹配他們,他們都必須逃脫。在我們的例子中,'.'在RegEx中有一個特殊的含義,所以我們將其轉義爲將它看作一個'.'字符本身。 – thefourtheye 2014-10-18 03:10:27