2012-03-21 145 views
0

想要匹配的網址是以外的網址來自javascript的評論功能。正則表達式「Url」外部註釋

正則表達式的URL:

((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+) 
給出這個例子

/* http://goog.le */ 
http://goog.le 

它應該只匹配第二。

我用這個表達式試圖here至今沒有成功:

(/*)[^(*/)]*((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+) 

感謝提醒

+0

不僅內部匹配字符串就夠了? – Qtax 2012-03-21 03:55:10

回答

1

一般很難(但肯定不是不可能的)做這樣用正則表達式解析 - 你有以使諸如輸入的假設良好形成。

首先請注意,在您的正則表達式中{1}是多餘的,因此可以刪除。

你可以做一些類似下面,它匹配的網址只有當它的後跟一個*/(沒有匹配/*)。其中的邏輯是,如果它後跟*/,它可能是在註釋:

((mailto\:|(news|(ht|f)tp(s?))\://)\S+)(?!([^*/]|\*[^/]|/[^*])*\*/) 

當然,如果你在源有*/這將失敗,而無需匹配的/*,例如

/* http://goog.le */ # this won't match 
http://goog.le  # this will match 
http://google/ "*/fdsa" # this won't match! 

我認爲你需要能在某種程度上任何正則表達式的方法依賴於輸入福祉形成 - 評論是平衡的,等

(如果使用的是JavaScript的,是有可能使用某種形式的XML解析呢?這種方式運行很多更好,可能會允許你在任何情況下忽略註釋)。

+0

這也不會匹配'http:// google// *其他評論* /' – porges 2012-03-21 03:41:08

+0

之類的東西哦,我知道我忘記了一些事情 - 會更新正則表達式。乾杯。 – 2012-03-21 03:53:11

+0

@mathematical。咖啡+1 thx的工作正則表達式,解釋的限制和XML建議,我會嘗試考慮更廣泛的方法。 – Email 2012-03-21 11:18:45

1

您可以使用替換並執行諸如http://jsfiddle.net/92ma8/這樣的工作,可用於字符串和轉義。

// remove comments 
// if you want to remove single line comments as well add: |\/\/.* 
var nocomments = code.replace(/("(?:[^"\\]*|\\.)*"|'(?:[^'\\]*|\\.)*')|\/\*[^]*?\*\//g, "$1"); 

// do your matching 
var result = nocomments.match(/[a-z]+:\/\/\S+/gi); 

在這個字符串:

/* http://aaa.com */    
http://bbb.com      
// http://ccc.com     
http://ddd.com "will \"*/ /*work" 
"/* http://eee.com */ works" 

它匹配:

http://bbb.com 
http://ccc.com 
http://ddd.com 
http://eee.com 
+0

好主意+1。但我真的只搜索正則表達式解決方案 – Email 2012-03-21 11:13:24

0
((?<!\/\*)) #Negative lookbehind 
    ((mailto\:|(news|(ht|f)tp(s?))\://)\S+)(?!([^*]|\*[^/])*\*/) 
(
    ?(1) # Ensure the negative lookbehind has matched (Embedded Condition) 
    (?!\*/) # Ensure the negative lookahead 
) 

這裏是一個班輪

((?<!\/\*))((mailto\:|(news|(ht|f)tp(s?))\://)\S+)(?!([^*]|\*[^/])*\*/)(?(1)(?!\*/)) 
+0

@Panuccio它與網址不匹配。 – Email 2012-03-21 11:16:17

+0

我用RegexBuddy來測試這個使用.NET引擎,它工作正常。我只是使用你的正則表達式來匹配URL,所以也許這部分不符合你的期望。對於你在你的問題中給出的「http://goog.le」例子,它是有效的。 – 2012-03-22 02:42:08