2012-03-21 2 views
0

хотел бы совместить URL-адреса, которые снаружи функция комментария от javascript.Regex «Url» наружные комментарии

Regex для 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

ответ

1

В целом это трудно (но, конечно, не невозможно), чтобы делать такого рода разбор с регулярным выражением - у вас есть чтобы сделать предположения, такие как ввод корректно сформирован.

Обратите внимание, что в вашем регулярном выражении {1} является избыточным, поэтому его можно удалить.

Вы можете сделать что-то вроде следующего, который соответствует URL, только если это не с последующим */ (без согласования /*). Логика в том, что если она в следуют */, это, вероятно, в комментарии:

((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// * other comment * /' – porges

+0

О, я знал, что забыл что-то - обновит регулярное выражение. веселит. –

+0

@ математический.кофе +1 thx для рабочего регулярного выражения, объяснение ограничения и предложение xml, которое я попытаюсь рассмотреть для более широкого подхода. – Email

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

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 это не соответствует URL-адресу. – Email

+0

Я использовал RegexBuddy для проверки этого с помощью движка .NET, и он работал нормально. Я просто использовал ваше регулярное выражение для соответствия URL-адресу, поэтому, возможно, эта часть не соответствует ожидаемому. Для примера «http: //goog.le», который вы дали в своем вопросе, он работает. –

Смежные вопросы