2009-03-17 8 views
0

Je travaille sur le code pl/sql où je veux remplacer « ; » qui est commenté avec '~'.C# regex pour remplacer un séparateur par un autre

par exemple.

Si j'ai un code comme:

--comment 1 with; 
select id from t_id; 
--comment 2 with ; 
select name from t_id; 
/*comment 3 
with ;*/ 

Alors je veux que mon texte résultat que:

--comment 1 with~ 
select id from t_id; 
--comment 2 with ~ 
select name from t_id; 
/*comment 3 
with ~*/ 

Peut-il être fait en utilisant regex en C#?

Répondre

4

Expression régulière:

((?:--|/\*)[^~]*)~(\*/)? 

code C# pour l'utiliser:

string code = "all that text of yours"; 
Regex regex = new Regex(@"((?:--|/\*)[^~]*)~(\*/)?", RegexOptions.Multiline); 
result = regex.Replace(code, "$1;$2"); 

Non testé avec C#, mais l'expression régulière et le remplacement fonctionne en RegexBuddy avec votre texte =)

note: Je ne suis pas très brillant écrivain d'expression régulière, il aurait probablement pu être mieux écrit. Mais ça fonctionne. Et les deux poignées vos cas avec un liner-les commentaires commençant par - et aussi ceux multilignes avec/* */

Edit: lire votre commentaire à l'autre réponse, donc retiré l'ancre ^, pour qu'il prenne soin des commentaires ne commençant pas sur une nouvelle ligne aussi.

Édition 2: Figuré il pourrait être simplifié un peu. Aussi trouvé que cela fonctionne bien sans l'ancre de fin $ ainsi.

Explication:

// ((?:--|/\*)[^~]*)~(\*/)? 
// 
// Options:^and $ match at line breaks 
// 
// Match the regular expression below and capture its match into backreference number 1 «((?:--|/\*)[^~]*)» 
// Match the regular expression below «(?:--|/\*)» 
//  Match either the regular expression below (attempting the next alternative only if this one fails) «--» 
//   Match the characters “--” literally «--» 
//  Or match regular expression number 2 below (the entire group fails if this one fails to match) «/\*» 
//   Match the character “/” literally «/» 
//   Match the character “*” literally «\*» 
// Match any character that is NOT a “~” «[^~]*» 
//  Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*» 
// Match the character “~” literally «~» 
// Match the regular expression below and capture its match into backreference number 2 «(\*/)?» 
// Between zero and one times, as many times as possible, giving back as needed (greedy) «?» 
// Match the character “*” literally «\*» 
// Match the character “/” literally «/» 
1

Un regex est pas vraiment nécessaire - vous pouvez itérer sur les lignes, localiser les lignes commençant par « - » et remplacer « ; » avec "~" sur eux.

String.StartsWith("--") - Détermine si le début d'une instance de chaîne correspond à une chaîne spécifiée. - Renvoie une nouvelle chaîne dans laquelle toutes les occurrences d'un caractère ou d'une chaîne Unicode spécifié dans cette instance sont remplacées par un autre caractère Unicode ou chaîne spécifié.

+0

bien, la chose est que je vais devoir le diviser sur une nouvelle ligne. et je ne veux pas que j'ai un code qui est trop grand. En outre, il peut arriver que pour un code comme sélectionnez * à partir de g; - sélectionnez l'instruction je ne serai pas en mesure de remplacer le; en commentaire. – Archie

Questions connexes