C # регулярное выражение для замены разделителя другим - PullRequest
0 голосов
/ 17 марта 2009

Я работаю над кодом pl / sql, где хочу заменить ';' который комментируется как '~'.

, например

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

--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 #?

Ответы [ 2 ]

4 голосов
/ 17 марта 2009

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

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

код 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 голос
/ 17 марта 2009

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

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

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

...