Regex, чтобы получить общую цену с пробелом в качестве разделителя - PullRequest
1 голос
/ 18 февраля 2020

Мне нужно построить регулярное выражение, которое бы улавливало общую цену, вот несколько примеров:

Total:   145.01 $
Total:   1 145.01 $
Total:   00.01 $
Total:   12 345.01 $

Необходимо получить любую цену, следующую за 'Total:', без '$'.

Вот что я получил до сих пор: (?<=\bTotal:\s*)(\d+.\d+)

RegExr

1 Ответ

0 голосов
/ 19 февраля 2020

Я предполагаю:

  • каждая строка должна начинаться 'Total: ' (три пробела), префикс ;
  • последний ди git в за строкой должен следовать ' $' (один пробел), суффикс , который находится в конце строки;
  • подстрока между префиксом и суффиксом должна заканчиваться '.dd', где 'd' представляет любой ди git, центов ;
  • подстрока между префиксом и центами должна соответствовать одному из следующих шаблонов, где 'd' представляет любой ди git: 'd', 'dd', 'ddd', 'd ddd', 'dd ddd', 'ddd ddd', 'd ddd ddd', 'dd ddd ddd', 'ddd ddd ddd', 'd ddd ddd ddd' и т. Д .;
  • возвращаемое значение - это подстрока между префиксом и суффиксом, которая удовлетворяет вышеуказанным требованиям; и
  • пробелы будут удалены из подстроки, возвращаемой в качестве отдельного шага в конце.

Мы можем использовать следующее регулярное выражение.

r = /\ATotal: {3}(\d{1,3}(?: \d{3})*\.\d{2}) \$\z/

In Ruby (но если вы не знаете Ruby, вы поймете идею):

arr = <<~_.split(/\n/)
Total:   145.01 $
Total:   1 145.01 $
Total:   00.01 $
Total:   12 345.01 $
Total:   1 241 345.01 $
Total:  1.00 $
Total:   1.00$
Total:   1.00 $x
My Total:  1.00 $
Total:   12 34.01 $
_

Следующее соответствует каждой строке в массиве arr и извлекает содержимое группы захвата 1 , которая показана с правой стороны каждой строки.

arr.each do |s|
  puts "\"#{(s + '"[r,1]').ljust(30)}: #{s[r,1] || 'no match'}"
end

"Total:   145.01 $"[r,1]       : 145.01
"Total:   1 145.01 $"[r,1]     : 1 145.01
"Total:   00.01 $"[r,1]        : 00.01
"Total:   12 345.01 $"[r,1]    : 12 345.01
"Total:   1 241 345.01 $"[r,1] : 1 241 345.01
"Total:  1.00 $"[r,1]          : no match
"Total:   1.00$"[r,1]          : no match
"Total:   1.00 $x"[r,1]        : no match
"My Total:  1.00 $"[r,1]       : no match
"Total:   12 34.01 $"[r,1]     : no match

Регулярное выражение может быть записано в свободный интервал * Режим 1054 * для самодокументирования.

r = /
    \A             # match the beginning of the string 
    Total:\ {3}    # match 'Total:' followed by 3 digits
    (              # begin capture group 1
      \d{1,3}      # match 1, 2 or 3 digits
      (?:\ \d{3})  # match a space followed by 3 digits
      *            # perform the previous match zero or more times
      \.\d{2}      # match a period followed by 2 digits
    )              # end capture group 1
    \ \$           # match a space followed by a dollar sign 
    \z             # match end of string
    /x             # free-spacing regex definition mode

Регулярное выражение можно увидеть в действии здесь .

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