尝试使用循环获取模式数据时获取异常

时间:2016-01-17 12:53:33

标签: java regex

我正在使用JAVA MAIL API阅读邮件。到目前为止,我正在获得 SKU 数据,因为邮件中只有一个 SKU ,例如:

邮件中的数据:

SKU: TX1234-3322

Quantity: 1

Price: $7.95

获取SKU的代码是:

public static List<String> SKUData = new ArrayList<String>();

if(Content.contains("SKU:"))
                   {
                       Pattern pat = Pattern.compile("SKU\\s*:\\s*(\\S*)");
                       Matcher matcher = pat.matcher(Content);
                       if(matcher.find()) {  //we've found a match
                           FinalSKU = matcher.group(1);
                       }

SKUData.add(FinalSKU);

最重要的是到目前为止工作正常,但是从现在开始我在单个邮件中获得多个SKU ,所以对于ex:

SKU: TX1234-3322

Quantity: 1

Price: $7.95

SKU: TX9090-8888

Quantity: 1

Price: $6.25

所以我尝试了代码:

for(int k=1;k<10;k++)
{
 if(Content.contains("SKU:"))
                       {
                           Pattern pat = Pattern.compile("SKU\\s*:\\s*(\\S*)");
                           Matcher matcher = pat.matcher(Content);
                           if(matcher.find()) {  //we've found a match
                               FinalSKU = matcher.group(k);
                           }

    SKUData.add(FinalSKU);
}

但是这个解决方案不起作用。当我的循环达到 k = 2 时,我会遇到异常。

当多次出现相同的模式数据时,如何使用模式获取数据。

1 个答案:

答案 0 :(得分:2)

你有点误解Matcher.group()。您需要多次致电Matcher.find()才能找到多个结果,然后阅读Matcher.group(1)所有结果。

还有一点需要注意:在循环中调用Pattern.compile,即使在方法中也是如此。模式的编辑很昂贵,你可能没有注意到,但是一旦你更频繁地调用它,你就会明显减慢程序的速度。将其设为private static final并重复使用曾经编译过的模式。

模式中的匹配组是()之间的所有内容(只要它不被转义)。因此,您的模式为SKU\\s*:\\s*(\\S*),您拥有的唯一匹配组是(\\S*)。当然,你可以拥有更多的团体,如果你需要更多的价值,但是因为ID(或者它可能是什么)是你唯一感兴趣的东西,你只需要这个一组。

您可以阅读有关匹配组(也称为捕获组)的更多信息here