Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Regex помогите сделать простой refactoring / 21 сообщений из 21, страница 1 из 1
06.05.2014, 12:41
    #38634424
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Regex помогите сделать простой refactoring
В проге в различных местах присутствуют строки вида
Код: sql
1.
2.
3.
4.
СИСТЕМА:ПЕРЕМЕННЫЕ:var0:ЗНАЧЕНИЕ
sys.var0.varValue.ToString()
var0.varValue >= var1.varValue
sys.var0



Нужно сделать замену var0 во всех этих строках при изменении его имени на любое другое (но не трогать подстроки вида kvar0 или var01)

C regexoм знаком слабо, поэтому родил пока наспех такого уродца:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
string a = "";
        string b = "";
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
             txtResult.Text = Refactor(txtSrc.Text,txtOld.Text, txtNew.Text);
        }

        public string MatchEvaluatorMethod(Match match)
        {
            return match.ToString().Replace(a, b);
        }

        public string Refactor(string src, string oldName, string newName)
        {
            string pattern_ = @"(\W|^)" +oldName +@"(\W|$)";
            a = oldName;
            b = newName;
            Regex reg_ = new Regex(pattern_);
            return Regex.Replace(src, pattern_, new MatchEvaluator(MatchEvaluatorMethod));
        }


Потестировал на нескольких примерах, вроде проблему решает, но!
Есть несколько вопросов:
1. Нормальный паттерн?
2. Как запулить в MatchEvaluatorMethod значения a и b?
3. Что лучше: использовать статический метод Regex.Replace или создать один объект Regex для ковыряния большого числа строк?

Спасибо
...
Рейтинг: 0 / 0
06.05.2014, 13:07
    #38634472
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Regex помогите сделать простой refactoring
Pallaris,

чем String.Replace не подходит? Обязательно хотите с регуляркой?
...
Рейтинг: 0 / 0
06.05.2014, 13:11
    #38634481
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Regex помогите сделать простой refactoring
user7320,

потому что
автор(но не трогать подстроки вида kvar0 или var01)
...
Рейтинг: 0 / 0
06.05.2014, 13:24
    #38634507
Belavik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Regex помогите сделать простой refactoring
Pallarisuser7320,

потому что
автор(но не трогать подстроки вида kvar0 или var01)

Так можно проверять наличие символа k перед подстрокой или 1 после подстроки
...
Рейтинг: 0 / 0
06.05.2014, 13:26
    #38634516
Belavik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Regex помогите сделать простой refactoring
Ваше решение решает проблему с "kvar0 или var01"?
...
Рейтинг: 0 / 0
06.05.2014, 13:28
    #38634518
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Regex помогите сделать простой refactoring
Belavik,

ну да
...
Рейтинг: 0 / 0
06.05.2014, 13:29
    #38634522
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Regex помогите сделать простой refactoring
BelavikТак можно проверять наличие символа k перед подстрокой или 1 после подстроки

Символ k и 1 - только для примера. Там могут быть любые буквы или цифры - в этом случае менять нельзя.
...
Рейтинг: 0 / 0
06.05.2014, 13:50
    #38634552
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Regex помогите сделать простой refactoring
Вот, глянул в сторону substitution, получилось без унылого делегата
Код: c#
1.
2.
3.
4.
5.
6.
7.
public string Refactor(string src, string oldName, string newName)
        {
            string pattern_ = @"(\W|^)(" + oldName + @")(\W|$)";
            Regex reg_ = new Regex(pattern_);
            string replc_ = @"$1"+newName+"$3";
            return reg_.Replace(src, replc_);
        }
...
Рейтинг: 0 / 0
06.05.2014, 16:16
    #38634743
Belavik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Regex помогите сделать простой refactoring
PallarisВот, глянул в сторону substitution, получилось без унылого делегата
Код: c#
1.
2.
3.
4.
5.
6.
7.
public string Refactor(string src, string oldName, string newName)
        {
            string pattern_ = @"(\W|^)(" + oldName + @")(\W|$)";
            Regex reg_ = new Regex(pattern_);
            string replc_ = @"$1"+newName+"$3";
            return reg_.Replace(src, replc_);
        }


А если без рег.выражений:
1. Если в начале строки "var0." заменять на newvalue + "."
2. Любые ".var0." заменять на "." + newvalue + "."
если я правильно задание понял
...
Рейтинг: 0 / 0
06.05.2014, 16:31
    #38634755
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Regex помогите сделать простой refactoring
Belavik,

вместо точки могут быть самые разные символы: +,-,*,/,),: и т.д. И вообще может не быть символа
...
Рейтинг: 0 / 0
06.05.2014, 16:44
    #38634771
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Regex помогите сделать простой refactoring
Я не понимаю до сих пор, чем string.Replace не подходит. Или заменять надо именно переменные - т. е. с пониманием, где код, а где комменты или часть имени переменной - такое заменять не надо? Если тупо пропарсить текст - то string.Replace, а если отрефакторить - то штатными средствами Студии по замену имён переменных.
...
Рейтинг: 0 / 0
06.05.2014, 16:50
    #38634781
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Regex помогите сделать простой refactoring
user7320,

в проге есть что-то типа скриптового языка, где используются внутренние объекты с именами (var0, var1 и т.д.) Вот мне надо дать возможность рефакторинга, чтоб если я меняю имя объекта, то во всех скриптах оно тоже поменялось - при этом не повредив другие имена типа zzzvar0, var0zzz и т.д.
...
Рейтинг: 0 / 0
06.05.2014, 17:10
    #38634814
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Regex помогите сделать простой refactoring
Pallarisuser7320,

в проге есть что-то типа скриптового языка, где используются внутренние объекты с именами (var0, var1 и т.д.) Вот мне надо дать возможность рефакторинга, чтоб если я меняю имя объекта, то во всех скриптах оно тоже поменялось - при этом не повредив другие имена типа zzzvar0, var0zzz и т.д.
А, понятно - нужен парсер со знанием морфологии (кажется, это так называется?) языка.
...
Рейтинг: 0 / 0
06.05.2014, 17:34
    #38634847
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Regex помогите сделать простой refactoring
Pallarisuser7320,

в проге есть что-то типа скриптового языка, где используются внутренние объекты с именами (var0, var1 и т.д.) Вот мне надо дать возможность рефакторинга, чтоб если я меняю имя объекта, то во всех скриптах оно тоже поменялось - при этом не повредив другие имена типа zzzvar0, var0zzz и т.д.а одноименные локальные переменные надо учитывать (и не менять)?
...
Рейтинг: 0 / 0
06.05.2014, 18:06
    #38634887
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Regex помогите сделать простой refactoring
Яростный Меч,

хм, слава Б-гу у меня такого понятия нет.
...
Рейтинг: 0 / 0
06.05.2014, 18:22
    #38634898
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Regex помогите сделать простой refactoring
Pallaris,

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

допустим, это латинские буквы, цифры и подчеркивание.
тогда
Код: c#
1.
2.
3.
4.
5.
string text = "423234 jopa jopa1 _jopa jopa()";
string oldName = "jopa";
string newName = "apoj";

text = Regex.Replace(text, "(?<=^|[^a-zA-Z0-9_])" + oldName + "(?=$|[^a-zA-Z0-9_])", newName);
...
Рейтинг: 0 / 0
06.05.2014, 18:42
    #38634915
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Regex помогите сделать простой refactoring
Яростный Меч,

Ну да, но вроде мой паттерн по смыслу такой же, но короче.
...
Рейтинг: 0 / 0
06.05.2014, 18:44
    #38634918
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Regex помогите сделать простой refactoring
Только подчеривание у меня не хватает, точно
...
Рейтинг: 0 / 0
06.05.2014, 19:16
    #38634937
petalvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Regex помогите сделать простой refactoring
Pallaris3. Что лучше: использовать статический метод Regex.Replace или создать один объект Regex для ковыряния большого числа строк?
Статические методы кэшируют скомпилированные значения паттерна. Поэтому повторные обращения к ним будут быстрее. В то время как при создании объекта регекса это будет происходить каждый раз. Следовательно, если ковыряния будут происходить не один раз, то экземпляр регекса (если остановить свой выбор на этом способе) лучше сделать полем класса.

Также следует учесть, что статические методы кэшируют по умолчанию только 15 последних паттернов. Если их будет больше 15, то первые будут теряться, и заново перекомпилироваться. Можно изменить значение свойства CacheSize. Или перейти на экземпляр.
...
Рейтинг: 0 / 0
06.05.2014, 19:20
    #38634941
petalvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Regex помогите сделать простой refactoring
Ну и конечно, стоит использовать параметр RegexOptions.Compiled, если регулярка используется много раз - это ускорит её работу (ценой затраты на предварительную компиляцию).
...
Рейтинг: 0 / 0
06.05.2014, 21:46
    #38635034
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Regex помогите сделать простой refactoring
petalvik,

спасибо за полезную инфу!
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Regex помогите сделать простой refactoring / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]