Невозможно заменить RegEx - PullRequest
5 голосов
/ 13 апреля 2011

У меня есть следующее:

Текст:

field id = "25" ordinal = "15" value = "& $ 01234567890- $ 2000 -"

Регулярное выражение:

(? <= Значение = "). * (? =") </p>

Строка замены:

& $ 09876543210- $ 2000-


Когда я запускаю Regex Replace в Expresso - приложение вылетает.

Если я запускаю Regex.Replace в C #, я получаю следующее исключение:

ArgumentException

parsing "& $ 01234567890- $ 2000-" - номера групп захвата должны быть меньше или равны Int32.MaxValue.

1 Ответ

11 голосов
/ 13 апреля 2011

A $N в шаблоне замены относится к группе захвата Nth , поэтому механизм регулярных выражений считает, что вы хотите сослаться на номер группы захвата "09876543210", и выдает ArgumentException. Если вы хотите использовать буквенный символ $ в строке замены, удвойте его, чтобы экранировать символ: & $$09876543210-$$2000-

string input = @"field id=""25"" ordinal=""15"" value=""& $01234567890-$2000-""";
string pattern = @"(?<=value="").*(?="")";
string replacement = "& $$09876543210-$$2000-";
string result = Regex.Replace(input, pattern, replacement);

Кроме того, ваш шаблон в настоящее время жадный и может соответствовать больше, чем предполагалось Чтобы сделать его не жадным, используйте .*?, чтобы оно не заканчивалось совпадением, кроме следующей двойной кавычки позже в строке, или [^"]*, чтобы оно совпадало со всем, кроме двойной кавычки. Обновленный шаблон будет: @"(?<=value="").*?(?="")" или @"(?<=value="")[^""]*(?="")". Если вы никогда не ожидаете, что атрибут value будет пустым, я предлагаю использовать + вместо * в любом из шаблонов, чтобы убедиться, что он соответствует хотя бы одному символу.

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