Java正则表达式分别匹配每个出现

时间:2013-06-27 06:56:34

标签: java regex pattern-matching

我有这个正则表达式:

<a href(.*foo.bar.*)a>

对于这个字符串,它只给我一个匹配,但我需要它给3个匹配。

<a href="https://foo.bar/1">First</a> RANDOM TEXT COULD BE HERE <a href="https://foo.bar/2">Second</a> RANDOM TEXT COULD BE HERE <a href="https://foo.bar/3">Third</a>

所以每个a href都应该是个人的。

我怎么能做到这一点?

编辑:

此代码搜索匹配项:

Pattern pattern = Pattern.compile("<a href(.*foo.bar.*)a>");
Matcher matcher = pattern.matcher(body);
List<String> matches = new ArrayList<String>();
while (matcher.find()) {
    matches.add(matcher.group());
}

3 个答案:

答案 0 :(得分:6)

更改为:

<a href(.*?foo\.bar.*?)a>

它消除了贪婪。真正的点应该转义为\.

答案 1 :(得分:1)

使用.*?代替.*。贪心量词匹配尽可能多的字符,而不情愿的量词匹配单个查找操作中最少的字符数。

此外,如果您打算匹配“foo.bar”的文字文本,请使用foo\.bar

答案 2 :(得分:0)

希望以下代码可以帮助您:

int noOfTimefoundString = 0;
Pattern pattern = Pattern.compile("<a href=\"https://foo.bar");
Matcher matcher = pattern.matcher(body);
List<String> matches = new ArrayList<String>();
while (matcher.find()) {
  matches.add(matcher.group());
  noOfTimefoundString++;
}
Iterator matchesItr = matches.iterator();
while(matchesItr.hasNext()){
  System.out.println(matchesItr.next());
}
System.out.println("No. of times search string found = "+noOfTimefoundString);