#java #regex
Вопрос:
Я пытаюсь извлечь информацию из сообщения в приложении для Android, используя регулярное выражение, в котором я пока не очень силен.
Необходимая мне информация выделена жирным шрифтом в следующей строке.
PFEDDTYGD Подтвердило.14/6/21 в 12:46 PMKsh 260.00 получено от 254725400049 ДЖОНА ДОУ. Новый баланс счета составляет 1 666 Кш. Стоимость транзакции, Кш1
код: PFEDDTYGD, дата: 14/6/21, время:12:46, полученная сумма: 260.00, номер телефона:254725400049 клиент: ДЖОН ДОУ
вот мой код: NB: строка в многострочном формате.
final String regex = "^([a-zA-Z0-9] )\s{1}[a-zA-Z0-9\.\s] Ksh([0-9,.] )\sfrom\s([a-zA-Z0-9\.\s] )\son\s([0-9/] )\sat\s([0-9:] )\s[A|P]M\s.*$";
final String string2 = "PFEDDTYG0D Confirmed.on 14/6/21 at 12:46PMKsh260.00 received from 254725400049 JOHN DOE. New Account balance is Ksh1,666. Transaction cost, Ksh1";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string2);
if(matcher.find()) {
String code = matcher.group(1);
String amountReceived = matcher.group(2);
String from = matcher.group(3);
String date = matcher.group(4);
String time = matcher.group(5);
String format = "code: %s amount received: %s from: %s date: %s time: %s";
System.out.println(String.format(format, code, amountReceived, from, date, time));
Ответ №1:
В шаблоне, который вы пробовали, есть части, которых нет в данных примера, а в некоторых частях недостаточно символов.
Вы можете обновить шаблон до 6 групп захвата, как:
^([a-zA-Z0-9] )s Confirmed.onh (d{1,2}/d{1,2}/dd)h ath (d{1,2}:d{1,2})w*Ksh(d (?:.d )?).*?bfromh (d )h ([^.] ).
Смотрите демонстрационную версию Java и демонстрационную версию регулярных выражений
final String regex = "^([a-zA-Z0-9] )\s Confirmed\.on\h (\d{1,2}/\d{1,2}/\d\d)\h at\h (\d{1,2}:\d{1,2})\w*Ksh(\d (?:\.\d )?).*?\bfrom\h (\d )\h ([^.] )\.";
final String string2 = "PFEDDTYG0D Confirmed.on 14/6/21 at 12:46PMKsh260.00 received from 254725400049 JOHN DOE. New Account balance is Ksh1,666. Transaction cost, Ksh1";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string2);
if(matcher.find()) {
String code = matcher.group(1);
String amountReceived = matcher.group(4);
String tel = matcher.group(5);
String from = matcher.group(6);
String date = matcher.group(2);
String time = matcher.group(3);
String format = "code: %s amount received: %s from: %s date: %s time: %s tel: %s";
System.out.println(String.format(format, code, amountReceived, from, date, time, tel));
}
Выход
code: PFEDDTYG0D amount received: 260.00 from: JOHN DOE date: 14/6/21 time: 12:46 tel: 254725400049