Как я могу сопоставить это с помощью RegEx? - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь создать регулярное выражение, чтобы соответствовать всей дате, описанию и сумме.У меня это почти получилось, НО строка, заканчивающаяся на «187927.42», путается и совпадает с «187927.42» вместо «-2,931.25».

Как мне сопоставить «22.12.15», «BNF»: eeeerere TECHNOLOGIES ID: 1231231231 BNF BK: K OTAK MAHINDRA BANK LTD ID: INKKBK0000810 PMT DET: 16 2105412 117,25 ЧАСОВ POP УСЛУГИ / FXREF / TE-3-8-15 "," -2,931.25 "?Вместе со всеми другими строками транзакции?

Вот выражение, которое я придумал /(\d{2}\/\d{2}\/\d{2})\s+(.*?)\s+([0-9\,\-]+\.\d{2}) *(?=\d\d\/|$(?!\n-?[\d\.]+$))/mis

См. Этот пример здесь https://regex101.com/r/X9HeWv/1

12/17/15 Online Banking transfer to CHK 4958 Confirmation# 1231231231 -300.00
12/18/15 Online Banking transfer to CHK 4958 Confirmation# 1231231231 -200.00
12/18/15 THE HARTFORD DES:NWerfLSCIC ID:13975910 INDN:wesedrfr TECHNOLGOIES CO
ID:9942902727 CCD
-78.75
12/21/15 Online Banking transfer to CHK 4958 Confirmation# 1231231231 -50.00
12/22/15 WIRE TYPE:FX OUT DATE:151228 TIME:0944 ET TRN:2015122200194472 FX:INR 187927.42
64.1117 BNF:eeeerere TECHNOLOGIES ID:1231231231 BNF BK:K OTAK MAHINDRA BANK
LTD ID:INKKBK0000810 PMT DET:16 2105412 117.25 HOURS POP SERVICES /FXREF/TE-3-8-15
-2,931.25
12/22/15 Online Banking transfer to CHK 4958 Confirmation# 1231231231 -6,000.00
12/28/15 FORD CREDIT DES:FORDCREDIT ID:XXXXXXXXX INDN:werwe wer CO
ID:7587806091 PPD
-1,180.00
12/28/15 SC EVERCODER SOF DES:IAT PAYPAL ID:J222226DW9MWA INDN:werwer eeee CO
ID:XXXXXXXXXC IAT PMT INFO: WEB 000000000000000900
-9.00
12/29/15 Online Banking transfer to CHK 4958 Confirmation# 1231231231 -200.00

ОБНОВЛЕНИЕ:

Таким образом, добавив условие, требующее разделителя тысяч, когда число больше, чем тысяча сработало.Но я чувствую, что это не лучший подход.

(\-?(?!0+\.00)(?=.{1,9}(\.|$))(?!0(?!\.))\d{1,3}(,\d{3})*(\.\d+)?)

(\d{2}\/\d{2}\/\d{2})\s+(.*?)\s+(\-?(?!0+\.00)(?=.{1,9}(\.|$))(?!0(?!\.))\d{1,3}(,\d{3})*(\.\d+)?) *(?=\d\d\/|$(?!\n+$))

https://regex101.com/r/T8sxkh/1

1 Ответ

0 голосов
/ 29 января 2019

Допущения:

  • Каждая запись состоит из трех частей: дата, описание и сумма.
  • Дата представлена ​​в формате dd/dd/dd и всегда сопровождаетсячерез пробел.
  • Сумма всегда отрицательна.
  • За суммой всегда следует конец строки.
  • В сумме используется , в качестве разделителя тысячи всегда включает . и два десятичных знака.
  • Описание может содержать новые строки, но оно никогда не содержит того, что выглядит как начало новой записи (т. е. новая строка, за которой следует дата).
  • Между описанием и суммой есть пробел или новая строка.

Вот лучшее, что мне удалось придумать:

^(\d{2}/\d{2}/\d{2}) (.*?)[ \n](-\d{1,3}(?:,\d{3})*\.\d\d)(?=\Z|\n\d{2}/\d{2}/\d{2} )

Флаги: msg

Объяснение:

^  # beginning of line (with m flag)
(\d{2}/\d{2}/\d{2})  # date (which we capture)
[ ]  # a literal space
(.*?)  # description (can match across lines with s flag)
       # it is completely free-form; we match until we find something that looks like an amount
[ \n]  # separator between description and amount, space or newline
(-\d{1,3}(?:,\d{3})*\.\d\d)  # the actual amount
(?=  # followed by either:
  \Z  # end of the input (i.e. end-of-string or newline followed by end-of-string)
|    # or:
  \n \d{2}/\d{2}/\d{2}[ ]  # a newline followed by a date and a space, i.e. the start of a new record
)

Демонстрационная версия: https://regex101.com/r/X9HeWv/2

...