2013-06-20 3 views
2

Как заменить всю строку шапки соответствующей версией версии паскаля? Например, если у меня есть эти строки:Замените строку капитала на Pascal Case с помощью Regex

SOMETHING_COOL SOMETHING_LESS_COOL WHATEV

Я хочу, чтобы этот вывод:

SomethingCool SomethingLessCool Whatev

Я получил это далеко с регулярным выражением:

^*public\s[\w-]+?(\?)?\s[A-Z]+?(_[A-Z]+)?(_[A-Z]+)? { get; set; } 

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

EDIT: Я буду использовать .NET/C#, глядя на файлы

+1

Какой язык или инструмент вы используете? –

+0

Откуда вы берете эти строки? Файл? Вход пользователя? –

+0

@ F.J выглядит как C#, который пытается сопоставить, так что, вероятно, для regex –

ответ

1

для паскаль корпуса идентификатора, как только вы совпали, вы можете использовать другой регулярное выражение.

Я изменил свой оригинальный регулярное выражение, так он использует смотрит вперед и назад, чтобы улавливать только идентификатор в матче

Этот код имеет некоторые C# код с фанки схемы именования и заменяет его с кодом Паскаля корпуса: -

var code = "public class Blah\r\n public int SOMETHING_LESS_COOL { get; set; }\r\n }"; 
var identifierRegex = new Regex(@"(?<=^\s*public\s[\w-]+?(\?)?\s)[A-Z]+(_[A-Z]+)*(?=\s*\{\s*get;\s*set;\s*\})", RegexOptions.Multiline);   
var underscoreRegex = new Regex(@"(_|\s|^)\w");   
var pascalCode = identifierRegex.Replace(code, 
     i => underscoreRegex.Replace(i.Value.ToLower(), 
          m => m.Value.ToUpper().Replace("_",""))); 

Хотя это изменит декларации, оно не заменит код, который использует эти свойства. Таким образом, вы останетесь с честной работой по очистке. Может показаться интересным увидеть, можете ли вы сценарировать визуальную студию для рефакторинга «Переименовать».

+0

Если вы используете 'var', вы используете код в строке. Если вы используете код в строке, вы не должны использовать 'RegexOptions.Compiled'. См. Этот [этот вопрос и ответ] (http://stackoverflow.com/questions/513412/how-does-regexoptions-compiled-work) для некоторых номеров производительности –

+0

@ScottChamberlain уверен, но если он построит это в класс I ' d больше ожидайте, что регулярные выражения будут настроены заранее, а затем он будет перебирать свои файлы, заменяя их ... –

+0

@ScottChamberlain взял их для фрагмента ... помогает немного уменьшить количество ошибок! –

0

Имея идентификатор в строковой переменной, попробуйте following:

var parts = identifier.Split('_'); 
var pascalCasedParts = parts.Select(p => p[0] + 
          new string(p.ToLower().Skip(1).ToArray())); 
var pascalIdent = string.Join("", pascalCasedParts.ToArray());