Regex отрицательный взгляд в будущее, не дающий желаемого результата - PullRequest
0 голосов
/ 10 мая 2018

У меня две строки, как написано ниже:

6015603 06/12/2017 06/12/2017 02:45:28 PM - BIL/001347764403/LOAN/NSP CR  20,000.00  8,381.002 S 6156702 06/12/2017 06/12/2017

6015603 06/12/2017 06/12/2017 - BIL/001347764403/LOAN/NSP CR  20,000.00  8,381.002 S 6156702 06/12/2017 06/12/2017

и регулярное выражение, как показано ниже:

[0-9]+\s+[0-9]{2}[\/][0-9]{2}[\/][0-9]{4}\s+[0-9]{2}[\/][0-9]{2}[\/][0-9]{4}\s*(?![0-9]{2}[:][0-9]{2}[:][0-9]{2}\s*(AM|PM)).*?(?=([0-9]+\s*[0-9]{2}[\/][0-9]{2}[\/][0-9]{4}+\s+[0-9]{2}[\/][0-9]{2}[\/][0-9]{4})|\\Z)

Как видите, я использовал отрицательный взгляд вперед, чтобы избежать времени

(?![0-9]{2}[:][0-9]{2}[:][0-9]{2}\s*(AM|PM))

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

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Вы можете добавить отрицательный прогноз (?!.*?\d{2}:\d{2}:\d{2}\s*[AP]M) после сопоставления с первой датой:

^\d+\s+\d{2}/\d{2}/\d{4}\s+\d{2}/\d{2}/\d{4}(?!.*?\d{2}:\d{2}:\d{2}\s*[AP]M).*?(?=(\d+\s*\d{2}/\d{2}/\d{4}\s+\d{2}/\d{2}/\d{4})|$)
                                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

См. Демоверсию regex .

Предварительный просмотр полностью провалит совпадение, если после первой даты и любых 0+ символов, как можно меньше, найдется временная подстрока, соответствующая шаблону \d{2}:\d{2}:\d{2}\s*[AP]M.

Я также добавил начало строки / строки ^ якоря, заменил все [0-9] на \d (короче), [\/] на / (регулярные выражения в Java не используют разделители регулярных выражений, следовательно, нет вам нужно экранировать /, который не является специальным метасимволом регулярных выражений), уменьшить (AM|PM) до [AP]M, чтобы уменьшить накладные расходы на группировку, и заменить \Z на $, но если вы имели в виду конец строки, а не строку, Вы можете использовать свой \Z якорь.

Обратите внимание, что в Java вам потребуется экранировать каждый обратный слеш в приведенной выше строке.

0 голосов
/ 10 мая 2018

Я получил решение, я не включал \ s * в отрицательный взгляд вперед.После включения он работает как нужно.

Неправильно было:

\s*(?![0-9]{2}[:][0-9]{2}[:][0-9]{2}\s*(AM|PM))

, а правильное:

(?!\s*[0-9]{2}[:][0-9]{2}[:][0-9]{2}\s*(AM|PM))

Я взял ссылку на ответ отследующая тема: regex: почему этот негативный взгляд не работает?

...