Извлечение значения после символа и неизвестного количества не-ди git символов - PullRequest
1 голос
/ 03 марта 2020

Из приведенных ниже данных мне нужно, чтобы RegEx извлек суммы значений, как показано жирным шрифтом ниже. Я использовал https://regex101.com/ для проверки выражений на значение, но не смог понять это правильно, что RegEx может достичь этого? Я пытаюсь извлечь значение после символа%.

%\d?.*

Вышеприведенное соответствует всем после%, но я только ищу значение.

Тест 1 46.6500% $ 4 463,82

Тест 2 36,5000% 25 215,72

1 Ответ

1 голос
/ 03 марта 2020

Вы можете использовать два подхода:

  • Использовать группу захвата и, как только совпадение найдено, получить значение группы 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; 
...