Вы можете использовать два подхода:
- Использовать группу захвата и, как только совпадение найдено, получить значение группы 1
- Если механизм регулярных выражений поддерживает шаблоны просмотра с переменной шириной, используйте это, чтобы установить левый контекстный шаблон, который не будет «потребляться», не будет добавлен к значению соответствия, но требуется соответствие шаблону.
Первый подход может быть реализовано с помощью
%\D*(\d(?:[.,\d]*\d)?)$
^-- cap. group --^
См. это демонстрационное выражение регулярного выражения .
Второе регулярное выражение (основанное на взгляде) -
(?<=%\D*)\d(?:[.,\d]*\d)?$
^- LB -^
См. это регулярное выражение demo .
Детали шаблона
(?<=%\D*)
- положительный взгляд сзади, требующий %
с последующим 0+ не- di git символов непосредственно слева от текущего местоположения %
- %
char \D*
- 0 или более не-di git символов (\d(?:[.,\d]*\d)?)
- Группа 1: \d
- ди git (?:[.,\d]*\d)?
- необязательная группа без захвата, которая соответствует одному или нулю nces of: [.,\d]*
- 0 или более вхождений .
, ,
или di git \d
- di git
$
- конец строки.
Поскольку вы используете. NET, здесь приведены фрагменты кода C#, показывающие, как извлечь первое вхождение с обоими подходами:
var result1 = Regex.Match(str, @"%\D*(\d(?:[.,\d]*\d)?)$")?.Groups[1].Value;
var result2 = Regex.Match(str, @"(?<=%\D*)\d(?:[.,\d]*\d)?$")?.Value;