2012-03-21 76 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