从 android 中的给定文本中提取值

Exctract values from given text in android

我正在尝试从给定的文本中提取值。

正文如下:

String 1: $.675.00 was spent on your CAPITAL ONE CREDIT Card ending 2123 on 2015-05-04:15:28:08 at Best Buy

String 2: $ 1,310.00 was spent on your Credit Card 5178XXXXXXXX6040 on MAY-04-15 at Amazon Stores.

我想从字符串中提取以下内容:

  1. $
  2. 之后的金额
  3. 信用卡文字
  4. 信用卡号(在本例中为 2123 或 5178XXXXXXXX6040)
  5. 在哪个地方(在本例中为 Best Buy 或 Amazon Stores)。

首先,我尝试从字符串中提取所有数字:我尝试了以下操作:

Pattern p = Pattern.compile("\d+");
Matcher m = p.matcher(string1);
Log.e("Value","from String"+m.group(0));

我总是收到以下错误:

05-05 10:09:35.532: E/AndroidRuntime(13618): java.lang.IllegalStateException: No successful match so far
05-05 10:09:35.532: E/AndroidRuntime(13618):    at java.util.regex.Matcher.ensureMatch(Matcher.java:471)
05-05 10:09:35.532: E/AndroidRuntime(13618):    at java.util.regex.Matcher.group(Matcher.java:578)

为什么文本中有数字却不匹配?

谢谢!

当您调用 m.group(0) 时,您实际上还没有告诉它尝试匹配内容。这就是它给你一个 IllegalStateException 的原因。

尝试:

while(m.find()) {
  Log.e("Value",String.format("From String: '%s'", m.group()));
}

正如@justhecuke 所说,使用模式拆分字符串值没有严格的格式,所以我使用了字符串函数,试一试

    String crType1 = "CREDIT Card ending ";//mind the space at end
    String crType2 = "Credit Card ";//mind the space at end

    String rate, cardNo, at;

    if (string1.contains(crType1)) {
        rate = getStringValue(string1, "$", " ");
        cardNo = getStringValue(string1, crType1, " ");
        at = getAddress(string1);
    } else {
        rate = getStringValue(string1, "$", " ");
        cardNo = getStringValue(string1, crType2, " ");
        at = getAddress(string1);
    }

    System.out.println(String.format("Rate : %s Card No : %s Address : %s", rate, cardNo, at));

方法

public static String getAddress(String string) {
    return string.substring(string.lastIndexOf("at") + 2, string.length()).trim();
}

public static String getStringValue(String string, String startString, String endString) {
    int startAt = string.indexOf(startString) + startString.length();
    int endAt = string.indexOf(endString, startAt);
    return string.substring(startAt, endAt).trim();
}