Регулярное выражение "Url" за пределами комментариев

хотел бы сопоставить URL-адреса, которые находятся за пределами функции комментариев от javascript.

Regex for Url's:

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

с учетом этого примера:

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

он должен соответствовать только второму.

Я пробовал здесь до сих пор с этим регулярным выражением без успеха:

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

спасибо за консультацию

3 ответа

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

Сначала обратите внимание, что в вашем регулярном выражении {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? Это работает намного лучше и, вероятно, позволит вам игнорировать комментарии в любом случае).


Вы можете использовать замену и делать такие вещи, как 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


((?<!--\/\*)) #Negative lookbehind
 ((mailto\:|(news|(ht|f)tp(s?))\://)\S+)(?!([^*]|\*[^/])*\*/)
(
 ?(1) # Ensure the negative lookbehind has matched (Embedded Condition)
 (?!\*/) # Ensure the negative lookahead
) 
</code-->
<p> Здесь один вкладыш</p> <pre class="prettyprint linenums">((?<!--\/\*))((mailto\:|(news|(ht|f)tp(s?))\://)\S+)(?!([^*]|\*[^/])*\*/)(?(1)(?!\*/)) </code--></pre><code>

licensed under cc by-sa 3.0 with attribution.