2009-03-17 8 views
1

Je veux extraire les commentaires d'une chaîne comme un bloc.C# Regex pour obtenir le bloc de commentaires sur le code pl/sql

par exemple. J'ai un code PL/SQL comme:

--comment1 
select * from t_table; 
--i want comment 2; 
/*i want comment 
3 */ 
--i want comment 4 
OPEN data_cur; 

Ici, je veux toute la ligne unique et commentaires multilignes avant d'ouvrir data_cur; mais après , sélectionnez * dans t_table; Par exemple, je veux un bloc de commentaires complet entre deux instructions PL/SQL.

Je veux que le regex pour correspondre à la chaîne et former les groupes comme:

  1. instruction SQL
  2. bloc entier commentaire

Peut-il être fait en utilisant une expression rationnelle?

+0

J'ai modifié le regex tel que demandé – VonC

+0

cette regex ne fonctionne pas correctement s'il n'y a aucune déclaration avant tout type de commentaires. c'est-à-dire si le commentaire vient en tant que première déclaration. – Archie

+0

Regex modifié comme demandé: group1 est o ou n commentaires (seulement pour la première correspondance), group2 est une déclaration, group3 est 0 ou n commentaires. – VonC

Répondre

2
(?ms)^\s*([^\-/\s][^;]+;)((?:(?:\s+/\*(?:.(?!\*/))+.\*/)|(?:\s+\-\-[^\r\n]+))*) 

devrait le faire bien.
(Note: (?ms) est le moyen en Java pour spécifier un « multi-ligne » mode « point-all », mais je tested in on RETester et il fonctionne)

Il peut détecter 0 ou plusieurs commentaires après la select.
commentaires multi-lignes sont acceptées entre /* et */ en raison de l'utilisation d'un positive lookahead(?:.(?!\*/))+ dans un groupe non-capture

Mise à jour: modification de détecter toute ligne « non-commentaire » avant 0 ou de nombreux commentaires.


Pour détecter comment1, then, puis commentaires:

(?ms)((?:(?:\s+/\*(?:.(?!\*/))+.\*/)|(?:\s+\-\-[^\r\n]+))*)\s*^\s*([^\-/\s][^;]+;)((?:(?:\s+/\*(?:.(?!\*/))+.\*/)|(?:\s+\-\-[^\r\n]+))*) 

Note: J'ai mise à jour dans les deux expressions régulières (celui du début et celui-ci), la partie de détection de l'instruction:

\s*([^\-/][^;]+;) 

à

\s*([^\-/\s][^;]+;) 

Remarque bis: seul le premier "comments - statement - comments" sera détecté.
Les blocs suivants seront également détectés, mais seulement comme: "statement - comments", puis "statement - comments", et ainsi de suite. (Les commentaires ci-dessus une déclaration font partie des commentaires ci-dessous la déclaration précédente )

+0

merci. mais cela devrait fonctionner pour toutes les instructions dans pl/sql et pas seulement pour select. – Archie

+0

Si je voulais le groupe comme: 1. Bloc de commentaire 2. Instructions SQL alors que dois-je faire? J'ai essayé de changer la séquence ainsi que la référence arrière à? Archie

Questions connexes