Regex положительный взгляд не работает, как я ожидаю - PullRequest
1 голос
/ 07 января 2020

Я пытаюсь заменить некоторые значения строки. Вот пример строки:

_-[$kr-123] * #,##0.00_-;-[$USD-456] * #,##0.00_-;_-[$GBP-789] * \";-\";??_-;_-@_-

В частности, я хочу заменить 123, 456 и 789 другими строками, которые извлекаются во время выполнения из Dictionary - другими словами, я думаю, что мне нужно использовать MatchEvaluator для замены на лету, поскольку потенциально могут потребоваться тысячи различных замен ди git на строку.

Ближайший шаблон регулярных выражений I Получил:

(?:\[[^\]]*-)(?<Id>[0-9]*)(?:\])

... где группа Id должна содержать мои совпадения. В настоящее время этот шаблон будет соответствовать, например, [$kr-123], [$USD-456] и [$GBP-789] во всей их полноте. Я ожидал, что когда я перейду из групп без захвата (?:) в положительные взгляды (?=), регулярное выражение будет соответствовать только ди git частям в скобках. Очевидно нет. Неужели я неправильно понял положительные взгляды, или, возможно, мой шаблон регулярных выражений плох для начала?

Обратите внимание, что я действительно получаю группу Id для каждого Match, но мне нужен Id сам по себе, чтобы быть Match, потому что замена Group в Match не очень хорошо работает внутри MatchEvaluator (или мне так кажется - хотя я не совсем знаком с API).

1 Ответ

1 голос
/ 07 января 2020

Вам необходимо использовать lookbehind вместо первой группы без захвата, поскольку проверяемый контекст находится слева от ожидаемого соответствия.

(?<=\[[^]]*-)[0-9]+(?=])

См. Демонстрационную версию regex . Обратите внимание, что вам не нужно экранировать ] символов, так как это первый символ в [^]] отрицательном классе символов и он находится вне класса символов в (?=]). Я бы порекомендовал добавить [ в класс отрицательных символов lookbehind: (?<=\[[^][]*-)[0-9]+(?=]), просто для того, чтобы проигнорировать это и избежать любых совпадений между [...] подстроками, которые не имеют цифр внутри.

Пример кода:

var dict = new Dictionary<string, string>(){ {"123", "word1"}, {"456", "word2"} };
var result = Regex.Replace(text, @"(?<=\[[^]]*-)[0-9]+(?=])", m => 
    dict.ContainsKey(m.Value) ? dict[m.Value] : m.Value));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...