Регулярные выражения — это выражения для поиска и замены текста по шаблону. Шаблон — строка символов, спецсимволов и модификаторов, описывающих правила, которым должен соответствовать разбираемый текст.
Сайт для проверки регулярных выражений: 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}» соответствуют формату даты.