Я предполагаю:
- каждая строка должна начинаться
'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
Регулярное выражение можно увидеть в действии здесь .