Je vois quelques problèmes avec votre regex :
Il n'est pas nécessaire que le |[\r\n]
dans votre regex ; une classe de caractères annulés comme [^*]
correspond à tout sauf à *
y compris les séparateurs de lignes. Ce n'est que le .
(point) qui ne correspond pas à ces métacaractères.
Une fois que vous êtes dans le commentaire, le seul caractère que vous devez rechercher est un astérisque ; tant que vous n'en voyez pas un, vous pouvez engloutir autant de caractères que vous le souhaitez. Cela signifie qu'il est absurde d'utiliser [^*]
alors que vous pouvez utiliser [^*]+
au lieu de cela. En fait, vous pourriez aussi bien mettre cela dans un groupe atomique -- (?>[^*]+)
-- parce que vous n'aurez plus aucune raison de renoncer à l'un ou l'autre de ces "nonasterisks" une fois que vous les aurez appariés.
En éliminant les éléments superflus, la dernière alternative à l'intérieur de vos parenthèses extérieures est la suivante \*+[^*/]
ce qui signifie "un ou plusieurs astérisques, suivis d'un caractère qui n'est ni un astérisque ni une barre oblique". Cela correspondra toujours à l'astérisque à la fin du commentaire, et il faudra toujours l'abandonner à nouveau parce que le caractère suivant est une barre oblique. En fait, s'il y a vingt astérisques jusqu'à la barre oblique finale, cette partie de votre regex les fera tous correspondre, puis elle les abandonnera tous, un par un. Puis la partie finale \*+/
-- les fera correspondre à ce qu'il faut pour qu'ils soient conservés.
Pour une performance maximale, j'utiliserais cette expression rationnelle :
/\*(?>(?:(?>[^*]+)|\*(?!/))*)\*/
Cela permettra de faire correspondre un commentaire bien formé très rapidement, mais plus important encore, si cela commence à correspondre à quelque chose qui ne correspond pas à la définition du n'est pas un commentaire valide, il échouera le plus rapidement possible.
Avec l'aimable autorisation de David Voici une version qui fait correspondre les commentaires imbriqués à n'importe quel niveau d'imbrication :
(?s)/\*(?>/\*(?<LEVEL>)|\*/(?<-LEVEL>)|(?!/\*|\*/).)+(?(LEVEL)(?!))\*/
Il utilise les groupes d'équilibrage de .NET, et ne fonctionnera donc pas dans une autre version. Par souci d'exhaustivité, voici une autre version (issue de la bibliothèque de RegexBuddy) qui utilise la syntaxe des groupes récursifs supportée par Perl, PCRE et Oniguruma/Onigmo :
/\*(?>[^*/]+|\*[^/]|/[^*])*(?>(?R)(?>[^*/]+|\*[^/]|/[^*])*)*\*/