2009-03-17 2 views
0

Я работаю над кодом pl/sql, где я хочу заменить ';' который прокомментирован «~».C# regex заменить разделитель на другой

например.

Если у меня есть код, как:

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

Тогда я хочу, чтобы мой результат текст как:

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

Это может быть сделано с помощью регулярных выражений в C#?

ответ

4

Регулярное выражение:

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

C# код, чтобы использовать его:

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

Не тестировался с C#, но регулярное выражение и замещение работы в RegexBuddy с текстом =)

Примечание: Я не очень яркий писатель регулярных выражений, поэтому, возможно, он был бы лучше написан. Но это работает. И обрабатывает оба ваших случая с однострочным комментарием, начиная с - и также многострочными с/* */

Редактировать: Прочитайте свой комментарий к другому ответу, поэтому удалите якорь ^, чтобы он заботился комментариев, не начинающихся с новой строки.

Редактировать 2: Возможно, оно немного упростилось. Также найдено, что он отлично работает без конечного $ anchor.

Объяснение:

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

Регулярное выражение действительно не нужно - вы можете перебирать строки, находить линии, начинающиеся с «-», и заменять «;» с "~" на них.

String.StartsWith("--") - Определяет, соответствует ли начало экземпляра String заданной строке.

String.Replace(";", "~") - Возвращает новую строку, в которой все вхождения указанного символа Unicode или String в этом экземпляре заменяются другим указанным символом Unicode или String.

+0

хорошо, дело в том, я должен буду разбить его на новую строку. и я не хочу, так как у меня есть слишком большой код. Также может случиться так, что для кода, такого как , выберите * from g; - выберите оператор i не сможет заменить; в комментарии. – Archie

Смежные вопросы