Regex для замены всех фигурных скобок, кроме случая '{0}' - PullRequest
2 голосов
/ 08 октября 2019

Я хочу проверить строку:

  • она может содержать от нуля до многих вхождений {0}
  • все остальные вхождения {или} должны быть удалены.

Итак: 'AbC{de{0} x{1}}' должно стать 'AbCde{0} x1'

Я пробовал это:

value = Regex.Replace(value, @"({|})+(?!{0})", string.Empty);

Но это дает мне ошибку:

Регулярное выражение: квантификатор (x, y) ничего не следует.

Что не так?

Ответы [ 2 ]

2 голосов
/ 08 октября 2019

Вы можете использовать

Regex.Replace(text, @"(\{0})|[{}]", "$1")

Или для поддержки любых цифр ASCII внутри {...},

Regex.Replace(text, @"(\{[0-9]+})|[{}]", "$1")

См. Демонстрационную версию regex

Подробности

  • (\{0}) - Группа захвата 1 ($1 относится к этому значению из строки замены): a {0} подстрока
  • | - или
  • [{}] - { или }.

Возможен другой подход с обходными путями:

Regex.Replace(text, @"{(?!0})|(?<!{0)}", string.Empty)

См. еще одна демонстрация регулярных выражений . Здесь {(?!0}) соответствует {, за которым не следует 0}, а (?<!{0)} соответствует }, которому не предшествует {0.

1 голос
/ 08 октября 2019

Вы можете использовать обходные пути для достижения своей цели: \{(?!0\})|(?<!\{0)\}

Объяснение:

\{(?!0\}) - сопоставить {, если за ним не следует 0} (из-за отрицательного просмотра)

| - чередование

(?<!\{0)\} - совпадение }, если ему не предшествует {0 (из-за отрицательного взгляда сзади)

Демонстрация

Пример кода:

Regex.Replace("AbC{de{0} x{1}}", @"{(?!0\})|(?<!\{0)\}", "")
...