Как заменить вещи между двумя символами флага с помощью регулярных выражений - PullRequest
0 голосов
/ 01 января 2019

Например, у меня есть текст ниже

некоторые {}} снаружи, а некоторые внутри $ aa {bb} cc {{dd} ee} ff $ и еще немного $ aa {bb}cc {{dd} ee} ff $ здесь.

Я называю $ символом флага, и теперь я хочу заменить все { или } между парами $...$ с помощью регулярных выражений.

Единственный способ, которым я могу придумать, - это заменить несколько раз, используя регулярное выражение

(\$.*?)(\{|\})

каждый раз, когда он заменяет { или } внутри $...$.После достаточного времени замены мы получили

некоторые {}} снаружи, а некоторые внутри $ aabbccddeeff $ и еще несколько $ aabbccddeeff $ здесь.

Недостаток:что вы не знаете, сколько раз ему нужно полностью заменить { или }, и это, по-видимому, вообще неэффективно.

Так что мне интересно, способен ли регулярное выражение сделать это водиночный забег?Для регулярного выражения я имею в виду совместимость с Perl.Но если Perl не может сделать это, я хотел бы знать, может ли другой вкус регулярных выражений.

1 Ответ

0 голосов
/ 01 января 2019

Попробуйте это регулярное выражение:

[{}](?=[^$]*\$(?:(?:[^$]*\$){2})*[^$]*$)

Нажмите для демонстрации

Замените каждое совпадение пустой строкой.

Объяснение:

  • [{}] - соответствует либо { или }
  • (?=[^$]*\$(?:(?:[^$]*\$){2})*[^$]*$) - положительный прогноз, чтобы убедиться, что вышеуказанное соответствуетследует нечетное число $ где-то позже в строке.Это позволит убедиться, что за { или } следуют 1, 3, 5 или 7 ... экземпляры $ где-то позже в строке.
...