Regex.Replace имеет странное поведение при неохотном совпадении - PullRequest
0 голосов
/ 10 февраля 2012

Отвечая на этот вопрос, я застрял в этой ситуации.Использование неохотного соответствия в моем регулярном выражении приводит к этому результату

string s = Regex.Replace(".A.", "\\w*?", "B");

B.BAB.B

Почему он не соответствует и не заменяет A?

1 Ответ

5 голосов
/ 10 февраля 2012

Поскольку \\w*? соответствует как можно меньшему количеству \w, , включая 0 из них .

Поскольку у вас есть \w* вместо \w+, регулярное выражениесоответствует 0 или более \w.

Поскольку у вас есть ? для \w*, наименьшее возможное совпадение для этого регулярного выражения - строка длиной 0, ''.

Поскольку ? заставляет регулярное выражение сопоставлять как можно меньшее совпадение, только ever соответствует строкам нулевой длины.Он не может соответствовать одному символу A, потому что это будет более длинное соответствие, чем самое короткое.

Следовательно, все строки 0 длины в .A. (то есть: ''.''A''.'', где каждый возможный 0-Строка длины, отмеченная как ''), заменяется на 'B', давая вам 'BAB'.

Если вы хотите отключить это поведение и заменить хотя бы один \w, вы можете использовать регулярное выражение \w+?.Однако, по той же причине, что и раньше, ? заставляет это заменить только \w длины один, так что вы также можете использовать регулярное выражение \w.

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