Регулярные выражения — это выражения для поиска и замены текста по шаблону. Шаблон — строка символов, спецсимволов и модификаторов, описывающих правила, которым должен соответствовать разбираемый текст.

Сайт для проверки регулярных выражений: regex101.com


Пример смс: «01.01.2016 12:12 Карта 4444, баланс 12345.67 RUB. Бонус 0 RUB»


Простой шаблон для поиска баланса:

  • Найти строку, которая описывает искомое значение. Например, «баланс 12345.67 RUB», или «Бонус 0 RUB».
  • Заменить значение, которое нужно найти, на «(.*?)«. Должно получится «баланс (.*?) RUB», или «Бонус (.*?) RUB».
  • Если в тексте есть символ «.» или «*«, перед каждым таким символом нужно поставить «\«, например «Бонус (.*?) RUB\.»

Искать баланс, только если эта смс по карте 4444:

Шаблон будет «4444.*баланс (.*?) RUB», где «.*» — любой символ 0 или больше раз. То есть, этот шаблон будет искать значение только в такой смс, в которой есть текст: «4444[любой текст]баланс [искомое значение] RUB».


Искать баланс, только если эта смс НЕ по карте 4444:

Шаблон будет «^(?!.*4444).*баланс (.*?) RUB», где «^(?!.*4444)» — проверка на текст «4444». Шаблон будет искать значение, только если в смс нет такого текста.


Спецсимволы:

  • \d или [0-9] — Цифровой символ
  • \D или [^0-9] — Нецифровой символ
  • \s или [ \f\n\r\t\v] — Пробельный символ
  • \S или [^ \f\n\r\t\v] — Непробельный символ
  • \w или [[:word:]] — Буквенный или цифровой символ или знак подчёркивания
  • \W или [^[:word:]] — Любой символ, кроме буквенного или цифрового символа или знака подчёркивания
  • ^ — Начало текста
  • $ — Конец текста

Использование спецсимволов, поиск времени:

Для поиска времени в смс, если делать по первому примеру, будет «01.01.2016 (.*?) Карта». Но это неправильный шаблон, так как дата может быть любой, не только 01.01.16. Тут на помощь приходят спецсимволы:

  • «\s(.*?) Карта» — ищет текст «[пробел][искомое значение]Карта».
  • «[\d]{4}\s(.*?) Карта» — ищет текст «[две цифры][пробел][искомое значение]Карта», где «[\d]» это цифры, а «{4}» — количество повторений.
  • «[\d]{2}\.[\d]{2}\.[\d]{4}\s(.*?)\sКарта» — ищет текст «[две цифры].[две цифры].[четыре цифры][пробел][искомое значение]Карта», где «[\d]{2}\.[\d]{2}\.[\d]{4}» соответствуют формату даты.