【问题标题】:Java regex matching each occurence separatelyJava 正则表达式分别匹配每个出现
【发布时间】:2013-06-27 06:56:33
【问题描述】:

我有这个正则表达式:

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

对于这个字符串,它只给了我 1 个匹配项,但我需要它来提供 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());
}

【问题讨论】:

标签: java regex pattern-matching


【解决方案1】:

改为:

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

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

【讨论】:

  • 出现问题,开始似乎也很贪心。正则表达式将匹配整个部分,但应该只取结尾。 &lt;a href="https://anyURL.com"&gt; TEST TEST&lt;/a&gt;&lt;a href="https://foo.bar/86917"&gt;MY REAL PAGE&lt;/a&gt;
【解决方案2】:

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

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

【讨论】:

  • 谢谢,喜欢的解释。
【解决方案3】:

希望以下代码对您有所帮助:

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);

【讨论】:

  • 是的,但我需要将它们存储到某个地方。我需要带有标签的完整网址。
猜你喜欢
  • 1970-01-01
  • 2010-09-19
  • 2011-03-30
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多