Маскировка / форматирование / фильтрация строк C # с регулярным выражением или без него

#c# #regex #string #string-formatting

#c# #регулярное выражение #строка #форматирование строк

Вопрос:

Надеюсь, это не слишком сложно, я просто не могу найти нужный мне ответ.

У меня есть строка с переменными, такими как: this is a %variable% string Формат переменных внутри строки произвольный, хотя в этом примере мы используем фильтр %{0}%

Я хочу сопоставить имена переменных со свойствами, и в идеале я не хочу перебирать GetProperties , форматируя и проверяя каждое имя. Что я хотел бы сделать, так это получить «переменную» в виде строки и протестировать это.

Я уже использую регулярное выражение для получения списка переменных в строке, используя данный фильтр:
string regExSyntax = string.Format(syntax, @"(?<word>w )"); но это возвращает их С ‘%’ (например, ‘%variable%’) и, как я уже сказал, этот фильтр произвольный, поэтому я не могу просто создать строку.Заменить.

Такое ощущение, что это должно быть прямолинейно….

Спасибо!

Ответ №1:

    "(?<word>w )"
  

Просто захватывает что-либо буквенно-цифровое и помещает его в именованную группу захвата под названием «Word»

Возможно, вам будет интересно узнать о lookbehind и lookahead. Например:

 "(?<=%)(?<word>w )(?=%)"
  

Вы можете сделать это немного более универсальным, поместив ваш фильтр в отдельную переменную:

     string Boundie = "%";
    string Expression = @"(?<="   Boundie   @")(?<word>w )(?="   Boundie   @")";
  

Я надеюсь, что это где-то рядом с тем, что вы ищете.

Комментарии:

1. Вот к чему я шел … 😉

2. Идеально 🙂 Я думаю, это показывает мою неопытность в регулярных выражениях. Спасибо.

3. Если у вас есть другой код, представляющий собой специальный символ регулярного выражения (например, $), вы должны экранировать его перед созданием выражения: string Boundie = Regex.Escape(«$»);

Ответ №2:

Учитывая, что ваш синтаксис регулярного выражения: string regExSyntax = string.Format(syntax, @"(?<word>w )"); , я предполагаю, что затем вы собираетесь создать Regex и использовать его для сопоставления с некоторой строкой:

 Regex reExtractVars = new Regex(regExSyntax);
Match m = reExtractVars.Match(inputString);
while (m.Success)
{
    // get the matched variable
    string wholeVar = m.Value;  // returns "%variable%"

    // get just the "word"
    string wordOnly = m.Groups["word"].Value;  // returns "variable"

    m = m.NextMatch();
}
  

Или я совершенно неправильно понял проблему?

Комментарии:

1. Черт возьми, я знал, что это будет легко. Это определенно тот ответ, который мне нужен, хотя ответ Guidhouse также был полностью верным. Я не знал, что вы можете получить доступ к таким группам. Спасибо.

Ответ №3:

Acron,

Если вы собираетесь запустить свой собственный анализатор скриптов … помимо того, что вы «немного сумасшедший», если только это не является целью упражнения (не так ли?), тогда я настоятельно рекомендую вам ПОЦЕЛОВАТЬ его… Сохраняйте простоту Stoopid.

Итак, что обозначает ПЕРЕМЕННУЮ в синтаксисе вашего скрипта? Это знаки процента? И они исправлены, да? Итак, %name% это переменная, но #comment # не является переменной … правильно? Фраза «этот фильтр произвольный» меня беспокоит. Что такое «фильтр»?

Если это не домашнее задание, тогда просто используйте существующий скриптовый движок с существующим, четко определенным, хорошо известным синтаксисом. Что-то вроде Jint, например.

Приветствия. Кит.

Комментарии:

1. Это не домашнее задание, нет, но использование настолько примитивно, что действительно нет смысла идти по пути полноценного синтаксического анализатора. Но вы совершенно правы, я мог бы применить синтаксис, я просто хотел бы сохранить его как можно более открытым. Зная свою отрасль, я, скорее всего, получу отзыв в духе «% слишком уродливы. Можем ли мы вместо этого использовать смайлики? :)переменная(:»

2. Итак, вы говорите парикмахерам «Доктор Чоппер запрещает большую чашку … youtube.com/watch?v=unkIVvjZc9Y