#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