Регулярные выражения VB.NET, соответствующие escape-символам

Хорошо, поэтому я ненавижу задавать вопросы RegEx, потому что мне нравится обычно их выяснять. Плюс это становится довольно раздражающим на другом конце, потому что люди, вероятно, всегда задают глупые вопросы "почему бы вам просто не смотреть"?

Мои требования просты. Я хочу использовать Regex.Replace для замены соответствия с помощью контекстно-зависимого значения. Для этого я использую MatchEvaluator. Но, чтобы сделать вещи проще, скажем, что я сопоставляю %v

Я хочу, чтобы %v был экранирован, поэтому, если я использую \%v, он не будет соответствовать. Все, что должно совпадать.

Образец, который я придумал, таков: (?:[^\\]|^)%v

Он в основном соответствует %v, если он встречается в начале строки, или если он следует за любым символом, кроме \. Он не фиксирует первую часть выражения.

Я знаю, что это не "правильный" способ сделать это. Но он работал отлично, пока я не заметил, что когда я использую этот шаблон в замене, он включает символ до %v в замене (duh, right?)

Итак, если у меня есть ThisIsAValue:%v, и я делаю Regex.Replace, заменив строку Value, мой результат будет ThisIsAValueValue вместо ThisIsAValue:Value

Я пробовал использовать это в Google, но тот факт, что "escape-символ" настолько тяжел в RegEx, что все результаты ориентированы на ИСПОЛЬЗОВАНИЕ escape-символов вместо того, чтобы выбирать их с помощью шаблона.

Любые знакомые из RegEx люди знают, как я могу сделать это правильно?

1 ответ

Вы можете вручную вернуть начальный символ, захватив его и включив в значение замены:

Regex.Replace("ThisIsAValue:%v", "([^\\]|^)%v", "$1Value")

licensed under cc by-sa 3.0 with attribution.