Массовая замена в значениях переменных названия переменной на ее макрос

Akcium

Client
Регистрация
16.12.2020
Сообщения
251
Благодарностей
125
Баллы
43
Добрый день, делаю своего рода пользовательские макросы, которые хранятся в файле и имеют следующий вид:

Код:
Macro_1 -> {Macro_2|Macro_3|Macro_4}
Macro_2 -> {1|2|3}
Macro_3 -> {a|b|c}
Macro_4 -> {!|@|#}
Загрузку из файла, создание переменных типа: Macro_1,Macro_2,Macro_3,Macro_4, в которых хранятся обработанные значения спинтакса я уже реализовал. Теперь, чтобы макросы обрабатывались (они хранятся в виде Macro_1 и т.д.), необходимо заменить их на вид типа {-Variable.Macro_1-}.

Регулярку для поиска я вроде бы составил : Macro_.*?(?=\W|\ |\r|\n|$)

Код создания переменных и обработки макросов:

C#:
var variables = project.Variables.ToArray();
foreach (var variable in variables){
string variableName = new Regex(@"(?<=\[).*(?=,)").Match(variable.ToString()).ToString();
string textForSpintax = new Regex(@"\{.*}").Match(project.Variables[variableName].Value).ToString();
  if(string.IsNullOrEmpty(textForSpintax)||string.IsNullOrWhiteSpace(textForSpintax)) {
  continue;
  }


string SpinraxResult = new Macros.Spintaxer().SpinString(textForSpintax, true);

SpinraxResult = System.Text.RegularExpressions.Regex.Replace(SpinraxResult, @"Macro_.*?(?=\W|\ |\r|\n|$)", "{"+"-тут найденное значение-"+"}");

project.Variables[variableName].Value = SpinraxResult;


  project.SendInfoToLog("",string.Format("Переменная: {0}, Значение: {1}, Результат Spintax: {2}",variableName, textForSpintax, SpinraxResult));
}
В С# разбираюсь плохо и вообще не нашел, как можно найденные вхождения оборачивать с двух сторон необходимым. В php давно бы сделал... Помогите, плиз)

Может, конечно, я вообще пошел не в ту степь и реализовать это можно как-нибудь по-другому, хз.

В тестах даже не понимаю, как в обработке текста в "На что заменять" искать вхождения, меняет просто на текст "$1":

83193
 
Последнее редактирование:

Akcium

Client
Регистрация
16.12.2020
Сообщения
251
Благодарностей
125
Баллы
43
Ладно, отбой, все сделал) Но все равно интересует принцип замен в тексте кубиками по вхождению, как, к примеру, обернуть искомое в кавычки?
 
Последнее редактирование:

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 820
Баллы
113
Поправьте регулярку на (Macro_.*?)(?=\W|\ |\r|\n|$) и тогда замена с Вашего скриншота сработает
83295
 
  • Спасибо
Реакции: Akcium

Akcium

Client
Регистрация
16.12.2020
Сообщения
251
Благодарностей
125
Баллы
43
Похоже, все же я поторопился(

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

К примеру, в переменной лежит: "Macro_2 Macro_3", после выполнения сохраняется: "{-Variable.
Macro_2-} {-Variable.Macro_2-}". Это без цикла, естественно.

C#:
var variables = project.Variables.ToArray();
//берем все переменные
foreach (var variable in variables){
string variableName = new Regex(@"(?<=\[).*(?=,)").Match(variable.ToString()).ToString();
//получаем названия

string textForSpintax = project.Variables[variableName].Value.ToString();
var myRegEx = @"(Macro_)([a-z0-9]*)";
string regex = myRegEx;

//составили регулярку и обрабатываем только не пустые и подходящие по названию Macro_***

  if(string.IsNullOrEmpty(textForSpintax)||string.IsNullOrWhiteSpace(textForSpintax)) {
  continue;
  }

  if(!Regex.IsMatch(variableName, regex)) {
    continue;
  }


string SpinraxResult = Macros.TextProcessing.Spintax(textForSpintax , true);  
//обрабатываем спинтакс

  try
    {
var  reg = new System.Text.RegularExpressions.Regex(regex, System.Text.RegularExpressions.RegexOptions.None);

for (int i = 0; i < reg.Matches(SpinraxResult).Count; i++)
   {     
//вся проблема, как по моему, с этим циклом  нужно взять все макросы Macro_*** и представить их переменной

string res = "{-Variable."+reg.Matches(SpinraxResult)[i]+"-}";

SpinraxResult = System.Text.RegularExpressions.Regex.Replace(SpinraxResult, regex, res);

   }

     }catch{}


project.Variables[variableName].Value = SpinraxResult;

}
 
Последнее редактирование:

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 820
Баллы
113

Akcium

Client
Регистрация
16.12.2020
Сообщения
251
Благодарностей
125
Баллы
43
Почему не используете вариант из этого сообщения?
потому что если макросы лежат в тексте, их не вычленишь, потому как рядом может быть текст, числа, знаки, прочее. (Хотя в большинстве случаях можно, но не во всех)
Впрочем, этот вопрос я решил самостоятельно)
 
Последнее редактирование:
  • Спасибо
Реакции: nicanil

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 820
Баллы
113
Впрочем, этот вопрос я решил самостоятельно)
Если на затруднит, то опишите как решили. Для потомков :-)
Возможно кто-то в будущем столкнётся с похожей проблемой.
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)