.NET Regex заменяет одинарный символ, соответствующий неизвестному символу - PullRequest
5 голосов
/ 07 октября 2011

Это меня очень озадачило.Почему я получаю повторяющиеся строки замены в следующем коде:

static void Main(string[] args)
{
    String input = "test";
    String pattern = ".*";
    String replacement = "replace";
    Console.WriteLine(Regex.Replace(input, pattern, replacement));
    Console.Read();
}

Это выводит на консоль:

replacereplace

Я понимаю, что регулярное выражение получает странные совпадающие символы конца строки, но должно бытьникто.Я также понимаю, что шаблон не может ничего соответствовать, но ясно, что вход не является ничем.Это происходит в .Net 3.5 и 4.0, и я получаю то же самое с SingleLine и MultiLine.

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

Ответы [ 2 ]

4 голосов
/ 07 октября 2011

Причина, по которой вы получаете две замены, заключается в том, что с .* вы получаете два совпадения: "test" и "".

Если вы измените .* на .+, это будет работатьвы ожидаете, что:

String pattern = ".+";

Другой вариант - добавить начало привязки строки:

String pattern = "^.*"; // I know this looks like a smiley
2 голосов
/ 07 октября 2011

Ничего не соответствует, а затем соответствует всему, поэтому у вас есть два совпадения и две замены.

...