2013-06-10 3 views
1

Я хочу извлечь C-подобные комментарии из источника, f.e. отРегулярное выражение, которое нельзя использовать

(обновленный пример)

/** 
* base comment 
* (c) SOMEBODY SOMETIME 
* something 
*/ 

///<!-- ------metadata-XML------- --> 
/// <module type="javascript"> A 
///<desc> some desc 
///  </desc> 
(function(a /* param A */) { // programmers comment ... enclosure 
/*! user doc 
this module .... 
* reguired 
..... 
*/ 
var b={}; // programmers in line comment 
// single line comments 

// The cookie spec says up to 4k per cookie, so at ~50 bytes per entry 
// that gives a maximum of around 80 items as a max value for this field 
    b.a=a; 
    var str = " tttt \/\/this is not comment ! tttt " 
    var str2 = " tttt \/\* this is not comment too ! \ 
.............. \*\/ ttt "; 
    global.b = b; 
}(global); 
///</module> 

регулярное выражение, которое я использую

^\s*\/\*(.*[\r\n]*)*\*\/ 

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

Что не так с этим регулярным выражением? Как возможно, что механизм regexp не может его решить? Есть ли какие-то регулярные выражения (синтаксически правильные, я думаю), которые нельзя использовать?

+1

Какой конечный язык вы используете? –

+0

1. PHP ... поддержка PCRE, 2. javascript в браузере или NodeJs ... без PCRE – supipd

ответ

5

Это называется Catastrophic Backtracking. Ваше регулярное выражение должно проверить много возможностей, потому что вы гнездования кванторы:

^\s*\/\*(.*[\r\n]*)*\*\/ 
     ^^ ^^ 

Лучше было быть так:

/^\s*\/\*.*?\*\//gms 

Посмотри here in action.

необходима опция s сделать . соответствовать новой строки, в m вариант, чтобы сделать ^ совпадает с началом он грести.

.*? соответствует как можно меньше символов.

+0

Предлагаемое регулярное выражение, похоже, захватывает больше строк, чем нужно, в одном совпадении. http://www.regex101.com/r/xK4lT3 –

+0

Я попытался исправить только Катастрофический откат. У этого регулярного выражения есть и другие проблемы. – stema

+0

ОК, я еще раз взглянул на регулярное выражение и переработал свой ответ. – stema

2
(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(//.*) 

это будет работать на C-подобные комментарии матч

+1

, если они не в строках \ o/ – Ven

+0

отлично функционирует для меня, огромное спасибо – supipd

+0

@suppid Я был проверен на моей стороне, он отлично работает для меня, поэтому я был дан вам. Ничего, чтобы услышать то же самое от вашего end ... – Gangadhar

1

если вы используете PCRE-как регулярное выражение, вы можете использовать это:

\s*+\/\*(?>[^*]++|\*++(?!\/))*\*\/ 

если ваш вкус регулярных выражений не поддерживает атомные группы и Применимые квантификаторы:

\s*\/\*(?:[^*]+|\*+(?!\/))*\*\/ 
+0

second regexp убивает RegexCoach и браузер (Google Chrome) тоже – supipd

+0

@stupid: странно, я не уверен, что это связано с регулярным выражением. Попробуйте еще один тестер регулярных выражений: http://regex.larsolavtorvik.com/ –

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