2014-12-08 4 views
1

Я хочу, чтобы получить показатели в матче регулярного выражения ниже:Получение точной подстроку, которая удовлетворяет соответствует регулярному выражению в

input : ab 
regex: a(?=b) 

Объект Match содержит информацию о фактической согласованной части строки (a) и не включает в себя утверждения нулевой ширины, которые необходимы для достижения успеха. Я хочу иметь возможность фиксировать точную подстроку, которая удовлетворяет этому совпадению. Я не хочу, чтобы для этого вручную была расширена строка. Мне кажется, должен быть метод где-то в FCL.

Edit:

Просто, чтобы сделать вещи более ясно, есть рекомендации, как не используя lookaheads. Мне хорошо известно, что я не должен использовать lookaheads, когда хочу на самом деле соответствовать части строки. Однако приложение, над которым я работаю, получает ряд регулярных выражений, которые будут использоваться на этапе предварительной обработки. Эти регулярные выражения не поддаются контролю. Я не могу гарантировать, что они должным образом соответствуют утверждениям нулевой ширины. На этом этапе согласованные регулярные выражения заменяются фрагментом текста. Для того чтобы следующее регулярное выражение заменило процедуру на работу, мне нужно уметь подстроку в строке, которая удовлетворяет регулярному выражению. Рассмотрим код ниже:

string input = "abcdefg"; 
Regex regex = new Regex("a(?=b)"); 
Match m = regex.Match(input); 
regex.Replace(m.Value, "z").Dump(); 

Первое уведомление, что я хочу, замена произойдет только в части ввода, что матч произошло, а не весь вход. Это очень важно, поскольку я не хочу, чтобы все матчи были заменены. Выведенный выше код - 'a', а не 'z'. Причиной этого является то, что m.Value равно a, и регулярное выражение не заменяет ни одного az. Он заменит a, найденный в 'ab' на 'z'. Я хочу иметь возможность передать 'ab' в функцию Replace.

Надеюсь, что это прояснит ситуацию.

+0

Итак, вы хотите получить «ab» правильно? –

+0

@ TheZenCoder Да –

+0

Вопрос не очень ясен. Не могли бы вы предоставить больше примеров (возможная строка ввода, то, что вы хотите совместить, и не хотите). Если бы я понял, что вы хотите, я думаю, что lookahead - не лучший оператор ... – AFract

ответ

1

Вы используете неправильный API для управления заменой: вместо передачи соответствия регулярному выражению используйте the four-argument overload of Replace, который дает вам более жесткий контроль над тем, что заменяется исходной строкой, и какие части строки следует учитывать для замена:

string input = "abcdefg"; 
Regex regex = new Regex("a(?=b)"); 
regex.Replace(input , "z", 1, 0).Dump(); 

Только первое совпадение будет заменено, начиная с нуля индекса. Если вы хотите продолжить замену дополнительных совпадений, измените последний параметр на новый начальный индекс. Сохраните третий параметр на 1, чтобы сделать не более одной замены.

+0

Спасибо. Именно то, что я искал. Не знал, что существует перегрузка. Я должен был сначала проверить это сам :) –

Смежные вопросы