我正在使用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 时,我会遇到异常。
当多次出现相同的模式数据时,如何使用模式获取数据。
答案 0 :(得分:2)
你有点误解Matcher.group()
。您需要多次致电Matcher.find()
才能找到多个结果,然后阅读Matcher.group(1)
所有结果。
还有一点需要注意:不在循环中调用Pattern.compile
,即使在方法中也是如此。模式的编辑很昂贵,你可能没有注意到,但是一旦你更频繁地调用它,你就会明显减慢程序的速度。将其设为private static final
并重复使用曾经编译过的模式。
模式中的匹配组是(
和)
之间的所有内容(只要它不被转义)。因此,您的模式为SKU\\s*:\\s*(\\S*)
,您拥有的唯一匹配组是(\\S*)
。当然,你可以拥有更多的团体,如果你需要更多的价值,但是因为ID(或者它可能是什么)是你唯一感兴趣的东西,你只需要这个一组。
您可以阅读有关匹配组(也称为捕获组)的更多信息here。