2015-06-15 3 views
1

Я смущен о том, почему следующее регулярное выражение:Почему регулярное выражение соответствует концу группы во втором матче?

CHANGES:(.|\n)*(\*\/) 

матчей на второй комментарий закрытия (*/) вместо первого в следующем блоке:

/* ysqwwqdeqwd 
Some general start comments and code description 

DESCRIPTION: 

    Interface for c 

CHANGES: 

    $Log: blala.h,v $ 
    Revision 1.7 2008/09/08 18:34:43 p 
    Updated copyright year. 
*/ 

#define startofcode yeah 

/* General include files for Object Oriented C code. 
*/ 
#include "oo.h" 
#include "const.h" 
#include "libmath.h" 

здесь мы получим следующее:

CHANGES: 
    ... 

*/ 

#define startofcode yeah 

/* General include files for Object Oriented C code. 
*/ 

вместо того, чтобы просто:

CHANGES: 
     ... 

    */ 

here is a live example. Основа здесь заключается в том, что я пытаюсь удалить кучу старых журналов фиксации svn стиля CVS из верхней части пучки .h файлов, которые больше не нужны.

+0

это потому, что '. *' Жадный. – HuStmpHrrr

ответ

2
CHANGES:(.|\n)*?(\*\/) 

       ^^ 

Вам нужно non greedy regex.See demo.When использовать greedy регулярное выражение он остановится в последней инстанции */ .Когда вы используете не жадный он остановится на первом экземпляре */. * жадный и будет потреблять как можно больше.

https://regex101.com/r/vH0sZ0/3

+0

У вас есть короткое объяснение причин? –

+0

Плюс 1, фантастический, спасибо за помощь. –

+0

На самом деле, как еще один вопрос, в этом файле больше '* /', почему он останавливается на втором? –