C # Regex Заменить и * - PullRequest
       1

C # Regex Заменить и *

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

Я программист на Perl, немного занимаюсь C #. Возникла странная проблема с Regex.Replace в отношении утверждения «ноль или больше», *.

Скажем, я хотел заменить ноль или более букв одной буквой. В Perl я мог бы сделать это:

my $s = "A";
$s =~ s/\w*/B/;
print $s;
$s now = "B"

Но если я попытаюсь сделать то же самое в C #, вот так:

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

Документы говорят: «Символ * не распознается как метасимвол в шаблоне замены»

Почему? И есть ли обходной путь, если вы хотите, чтобы часть вашего регулярного выражения выплескивала некоторую оставшуюся строку, которой может не быть (например, ". *?" В конце)

(это глупый пример, но вы поняли)

Ответы [ 2 ]

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

Мэтт Феллоуз имеет правильный ответ о том, как это исправить. Я верю, что могу попытаться объяснить, почему это так ломается, хотя ...

Учтите это:

Regex.Replace ("AAA", @ "Z *", "!!! | $ & |")

Будет возвращено:

!!!||A!!!||A!!!||A!!!||

Z * в этом случае будет соответствовать серии строк нулевой длины, каждая из которых расположена до или после одного из символов А. $& вставляет совпадающую строку, которая в этом случае, которую мы видим, пуста.

Похожая вещь случается с

Regex.Replace("AAA", @"A*", "!!!|$&|")

Что возвращает

!!!|AAA|!!!||

Соответствие A * начинается в начале и соответствует «AAA». Затем он соответствует "" и затем останавливается.

Я не уверен, является ли это желаемым поведением в этом случае, но я подозреваю, что это необходимый побочный эффект способа, которым A * соответствует строкам нулевой длины.

Конечно, когда вы изменяете шаблон на ^A*$, привязка означает, что существует только одно возможное совпадение, и больше похожа на ожидаемую в этом случае.

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

Начните ваш шаблон с ^ и завершите его $, и ваша проблема решена.

string s = Regex.Replace("AAAA", @"^\w*$", "B");
Console.Write(s);

В качестве альтернативы - вы можете прекратить сопоставлять строки 0 длины с помощью оператора + вместо *оператор:

string s = Regex.Replace("AAAA", @"\w+", "B");
Console.Write(s);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...