Look Around не дает ожидаемого результата с .net - PullRequest
2 голосов
/ 19 октября 2010

Я хочу использовать упреждающее регулярное выражение для замены методом System.Text.RegularExpression.Replace(...).

Теперь мне интересно, что не так.Посмотрите на этот пример кода:

        string input = "stackoverflow";
        string replacement = "#";

        var pattern1 = "(?=[a-z])o";
        var result1 = Regex.Replace(input, pattern1, replacement);
        // result1 = stack#verfl#w (as expected)

        var pattern2 = "(?=[a-k])o";
        var result2 = Regex.Replace(input, pattern2, replacement);
        // result2 = stackoverflow (expected: stack#overflow)

        var pattern3 = "(?=k)o";
        var result3 = Regex.Replace(input, pattern3, replacement);
        // result3 = stackoverflow (expected: stack#overflow)

        var pattern4 = "[a-k]";
        var result4 = Regex.Replace(input, pattern4, replacement);
        // result4 = st###ov#r#low (as expected)

        var pattern5 = "([a-k])o";
        var result5 = Regex.Replace(input, pattern5, "$1#");
        // result5 = stack#verflow" (as expected)

Это очень странно.Я могу использовать [a-z] в своем прогнозном выражении, но не [a-k] или даже k.Что я действительно хочу, так это результат последнего примера (pattern5).Это глобус, но я не понимаю, почему pattern2 или pattern3 не возвращают ожидаемого.Результаты.

Ответы [ 2 ]

2 голосов
/ 19 октября 2010

Я думаю, у вас есть идея заглянуть немного запутанно. Когда вы говорите, в шаблоне 2,

(?=[a-k])o

это означает, что «когда мы находимся в месте, где следующий символ имеет значение от a до k, соответствует o». Неудивительно, что это никогда не совпадает - если мы находимся в месте, где следующий символ равен что-то от a до k, это не и будет o!

Схема 3 еще ярче

(?=k)o

означает «когда мы находимся в месте, где следующий символ - k, соответствует o». Опять нет совпадений.

Причина, по которой pattern1 соответствует , заключается в том, что o находится в a-z, поэтому всякий раз, когда следующий символ равен o, он также соответствует критерию "что-то в a to z ', и так совпадает.

Я также не уверен, почему вы ожидали, что # не заменит o в 2 и 3. Если 5 делает то, что вы хотите, то, конечно, вы можете просто использовать его? Я не могу с готовностью увидеть, как использовать упреждающий просмотр, чтобы сделать то, что делает 5 - чтобы выполнить операцию 'сопоставить (просто) o, что предшествует чем-то от a до k ', посмотрите- позади кажется очевидным ответом:

(?<=[a-k])o

должно соответствовать именно такому o (но я сам не запускал его).

1 голос
/ 19 октября 2010

Проблема в том, что (? = Соответствует текущему входу, но не движется вперед. Таким образом (? = [Az]) соответствует «o», не двигаясь вперед, и затем вы соответствуете «o»".

Вы хотели посмотреть назад? Будет ли" (? <= K) o "работать на вас? </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...