powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Regex помогите сделать простой refactoring
21 сообщений из 21, страница 1 из 1
Regex помогите сделать простой refactoring
    #38634424
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В проге в различных местах присутствуют строки вида
Код: 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
Regex помогите сделать простой refactoring
    #38634472
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pallaris,

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

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

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

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

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

Символ k и 1 - только для примера. Там могут быть любые буквы или цифры - в этом случае менять нельзя.
...
Рейтинг: 0 / 0
Regex помогите сделать простой refactoring
    #38634552
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_);
        }
...
Рейтинг: 0 / 0
Regex помогите сделать простой refactoring
    #38634743
Фотография Belavik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Regex помогите сделать простой refactoring
    #38634755
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Belavik,

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

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

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

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

хм, слава Б-гу у меня такого понятия нет.
...
Рейтинг: 0 / 0
Regex помогите сделать простой refactoring
    #38634898
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Regex помогите сделать простой refactoring
    #38634915
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Яростный Меч,

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

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

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


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