【问题标题】:I want to extract information from a message using regex我想使用正则表达式从消息中提取信息
【发布时间】:2022-01-26 11:03:53
【问题描述】:

我有一个使用广播接收器收听传入 SMS 消息的应用。

该应用仅接收来自特定发件人的消息。我想从消息中提取某些信息,即

  • Txn 代码
  • 日期
  • 时间
  • 金额
  • 帐户
  • 用户名

QAP04N99TG Confirmed.on 25/1/221:57 PMKsh1.00 收到>1123123322 约翰·杜马丁。新账户余额为 Ksh10.00。交易成本,Ksh0.00。

我尝试过使用下面的方法,但我只得到了 Txncode。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Example {
    public static void main(String[] args) {
        final String regex = "^([a-zA-Z0-9]+)\s{1}[a-zA-Z0-9\.\s]|Ksh([0-9,.]+)\s|from\s([0-9]+)\s([a-zA-Z]+\s[a-zA-Z]+\s[a-zA-Z]+.)$";
        final String string = "QAP04N99TG Confirmed.on 25/1/22 at 1:57 PMKsh1.00 received from 1123123322 JOHN DUE MARTIN. New Account balance is Ksh10.00. Transaction cost, Ksh0.00.";

        final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
        final Matcher matcher = pattern.matcher(string);

        if(matcher.find()) {
            String txnCode = matcher.group(1);
            String date = matcher.group(2);
            String time = matcher.group(3);
            String amount = matcher.group(4);
            String account = matcher.group(5);
            String username = marcher.group(6);

            System.out.println(txnCode+date+time+amount+account+username);
        }
    }
}

我只能得到 txnCode。 如果你知道我可以提取所有细节。请协助。

【问题讨论】:

  • 您使用替换 | 来匹配字符串中的不同部分,请注意,总共没有 6 个组。最后一个替代断言字符串 $ 的结尾,但该部分当前不匹配。字符串中数据的顺序是否始终相同,所有部分是否始终存在?
  • 首先if(matcher.find()) 应该是while (matcher.find()) 但是您的正则表达式模式中还有其他问题
  • 也许this 模式有帮助?

标签: java regex android-studio


【解决方案1】:

您可以使用匹配和捕获这些信息

^(\w+)\s.*?(\d{1,2}/\d{1,2}/\d{2,})\s+at\s+(\d{1,2}:\d{1,2}).*?Ksh([0-9,.]+)\s.*?from\s+(\d+)\s+([a-zA-Z\s]+)

请参阅regex demo详情

  • ^ - 字符串开头
  • (\w+) - 第 1 组:一个或多个单词字符
  • \s.*? - 尽可能少的空格和任何零个或多个字符(换行符除外)
  • (\d{1,2}/\d{1,2}/\d{2,}) - 第 2 组:一位或两位数,/,一位或两位数,/,然后是两位或多位数字
  • \s+at\s+ - at 包含一个或多个空格
  • (\d{1,2}:\d{1,2}) - 第 3 组:一位或两位,:,一位或两位
  • .*?Ksh - 任何零个或多个字符,除了尽可能少的换行符和Ksh
  • ([0-9,.]+) - 第 4 组:一位或多位数字,., 字符
  • \s.*?from\s+ - 一个空格,除换行符之外的任何零个或多个字符尽可能少,from 和一个或多个空格
  • (\d+) - 第 5 组:一位或多位数字
  • \s+ - 一个或多个空格
  • ([a-zA-Z\s]+) - 第 6 组:一个或多个字母或空格。

Java demo

String regex = "^(\\w+)\\s.*?(\\d{1,2}/\\d{1,2}/\\d{2,})\\s+at\\s+(\\d{1,2}:\\d{1,2}).*?Ksh([\\d,.]+)\\s.*?from\\s+(\\d+)\\s+([a-zA-Z\\s]+)";
String string = "QAP04N99TG Confirmed.on 25/1/22 at 1:57 PMKsh1.00 received from 1123123322 JOHN DUE MARTIN. New Account balance is Ksh10.00. Transaction cost, Ksh0.00.";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string);
while(matcher.find()) {
    String txnCode = matcher.group(1);
    String date = matcher.group(2);
    String time = matcher.group(3);
    String amount = matcher.group(4);
    String account = matcher.group(5);
    String username = matcher.group(6);
    System.out.println(txnCode+">"+date+">"+time+">"+amount+">"+account+">"+username);
}
// => QAP04N99TG>25/1/22>1:57>1.00>1123123322>JOHN DUE MARTIN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多