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

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

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

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

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

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

Спасибо!


person Antony Woods    schedule 03.05.2011    source источник


Ответы (3)


Учитывая, что ваш синтаксис регулярного выражения: 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();
}

Или я совсем неправильно понял задачу?

person Jim Mischel    schedule 03.05.2011
comment
Черт возьми, я знал, что это будет легко. Это определенно тот ответ, который мне нужен, хотя ответ Гидхауса также был полностью верным. Я не знал, что у тебя есть доступ к таким группам. Спасибо. - person Antony Woods; 03.05.2011

   "(?<word>\w+)"

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

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

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

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

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

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

person Guidhouse    schedule 03.05.2011
comment
Вот я и собирался... ;-) - person corlettk; 03.05.2011
comment
Отлично :) Думаю, это показывает мою неопытность в RegEx. Спасибо. - person Antony Woods; 03.05.2011
comment
Если у вас есть другой Boundie, который является специальным символом Regex (например, $), вы должны экранировать его, прежде чем создавать выражение: string Boundie = Regex.Escape($); - person miasbeck; 03.04.2012

Акрон,

Если вы собираетесь перевернуть свой собственный анализатор сценариев... помимо того, что он "немного сумасшедший", если только это не является целью упражнения (не так ли?), то я настоятельно рекомендую вам ПОЦЕЛУЙ его... Держите его Простой тупик.

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

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

Ваше здоровье. Кейт.

person corlettk    schedule 03.05.2011
comment
Нет, это не домашняя работа, но использование настолько, настолько примитивно, что действительно нет смысла идти по маршруту полноценного синтаксического анализатора. Но вы совершенно правы, я мог бы применить синтаксис, я просто хотел бы, чтобы он был как можно более открытым. Зная свою отрасль, я, скорее всего, получу отзывы о том, что % слишком уродливы. Можем ли мы использовать смайлики вместо этого? :)переменная(: - person Antony Woods; 03.05.2011
comment
Итак, вы говорите парикмахерам, что доктор Чоппер запрещает большую чашку... youtube.com/watch?v =unkIVvjZc9Y - person corlettk; 03.05.2011