2009-03-17 8 views
0

Ich arbeite an PL/SQL-Code, wo ich ";" was mit '~' kommentiert wird.C# regex zum Ersetzen eines Trennzeichens durch ein anderes

z.B.

Wenn ich einen Code wie haben:

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

dann will ich mein Ergebnis Text:

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

Kann es getan werden in C# mit regex?

Antwort

4

Regulärer Ausdruck:

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

C# -Code, um es zu verwenden:

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

nicht mit C# getestet, aber der regulären Ausdruck und der Austausch funktioniert in RegexBuddy mit Ihrem Text =)

Hinweis: Ich bin kein sehr brillanter Autor für reguläre Ausdrücke, also könnte es wahrscheinlich besser geschrieben worden sein. Aber es funktioniert. Und behandelt beide Fälle mit Ein-Liner-Kommentare beginnend mit - und auch die mehrzeiligen mit/* */

Edit: Lesen Sie Ihren Kommentar zu der anderen Antwort, so entfernt die ^ Anker, so dass es vorsichtig ist von Kommentaren, die auch nicht auf einer neuen Zeile beginnen.

Edit 2: Dargestellt könnte es ein wenig vereinfacht werden. Auch gefunden, es funktioniert gut ohne die Endung $ Anker auch.

Erläuterung:

// ((?:--|/\*)[^~]*)~(\*/)? 
// 
// 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

Eine Regex wird nicht wirklich benötigt - Sie können auf Zeilen iterieren, suchen Sie die Zeilen beginnend mit "-" und ersetzen ";" mit "~" auf ihnen.

String.StartsWith("--") - Bestimmt, ob der Beginn einer Instanz von String mit einer angegebenen Zeichenfolge übereinstimmt.

String.Replace(";", "~") - Gibt eine neue Zeichenfolge zurück, in der alle Vorkommen eines angegebenen Unicode-Zeichens oder einer Zeichenfolge in dieser Instanz durch ein anderes angegebenes Unicode-Zeichen oder String ersetzt werden.

+0

gut, ist die Sache, die ich es auf Newline aufgeteilt werden müssen. und ich möchte nicht, da ich einen Code habe, der zu groß ist. Auch kann es passieren, dass für einen Code wie wählen Sie * aus g; - wählen Sie die Anweisung ich werde nicht in der Lage sein zu ersetzen; im Kommentar. – Archie

Verwandte Themen