如何捕获Java中正则表达式匹配后的文本?

时间:2012-10-15 05:34:33

标签: java regex

我正在开展一项工作,我需要在网站中搜索并提取转化率。

如果我能够简单地匹配费率,这将很容易捕获和提取,但我需要能够点击更新按钮并让程序搜索更新的转换率,所以我不能简单硬编码匹配搜索。

有没有一种方法可以匹配费率之前的文字并捕获匹配后的所有文字?

如果有更好的方法,我也愿意接受建议。我只是需要帮助才能知道如何在我不确切知道费率的情况下从网站上获得费率。我只知道费率的格式以及费率在网站内的位置。

这是我到目前为止所做的:

String regex = "(?<=EUR'>)\\d+(?:\\.\\d*)?(?=<)";

Pattern pattern = Pattern.compile(regex);
Matcher match = pattern.matcher(?);

while (match.find()) {   
  System.out.println("Found a match: " + match.group(1).toString());  
  System.out.println("Start position: " + match.start(1)); 
  System.out.println("End position: " + match.end(1)); 
} 

我想我理解如何设置模式,但是如果我只知道开头和结尾是什么而不是结束,我不确定我应该为匹配字符串添加什么......

我需要抓住的一个例子是

下面的一行
<td class='rtRates'><a href='/graph/?from=USD&amp;to=EUR'>0.772000</a></td>

我需要抓住这一行中的费率,但它会不断变化

3 个答案:

答案 0 :(得分:0)

不要使用正则表达式来解析html,否则快速变速器会来吃掉你。使用jsoup之类的内容,查询<a><td>元素rtRates的{​​{1}}元素。

答案 1 :(得分:0)

我不确定你的问题是什么,因为你的表达符合你的预期(我认为)。 See it on Regexr

如果您想更灵活地了解标签之间的部件,您可以使用:

(?<=EUR'>)[^<]*

[^<]是一个否定的角色类。它将匹配除<之外的任何字符。然后你也可以删除先行断言。

See it on Regexr

答案 2 :(得分:0)

你能不能用它?

EUR'>(\d+(?:\.\d+)?)<

速率在第1组中捕获,这很方便,因为您已经使用group(1)来提取它。 ;)但严重的是,你的正则表达式中没有捕获组,因此在Matcher上调用group(1)会导致异常。是什么给了什么?

P.S。请注意,我已将您的\d*更改为\d+。几乎所有试图匹配十进制数的人都要求小数点后至少有一位数。如果不是这种情况,请继续将其更改回来。