Java正则表达式匹配模式并提取它们

时间:2009-09-09 09:50:05

标签: java regex

我尝试使用正则表达式编写Java程序以匹配模式并提取它。给定一个字符串,例如“这是一个链接 - #www.google.com#,这是另一个#google.com#”,我应该可以获得#www.google.com#和#google.com#strings extract。这是我试过的 -

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ParseLinks {
    public static void main(String[] args) {
        String message = "This is a link- #www.google.com# and this is another #google.com#";
        Pattern p = Pattern.compile("#.*#");

        Matcher matcher = p.matcher(message);

        while(matcher.find()) {
            String result = matcher.group();
            System.out.println(result);
        }       
    }
}

这会产生输出#www.google.com#,这是另一个#google.com#。但我想要的只是字符串#www.google.com#和#google.com#extracted。我可以为此了解正则表达式吗?

3 个答案:

答案 0 :(得分:6)

#[^#]+#

虽然考虑到这一点,但由于相当明显的原因,哈希标记是划分网址的不错选择。

你的不起作用的原因是明星的贪婪(来自regular-expressions.info):

  

[明星]重复上一个项目   零次或多次。贪心,所以很多   尽可能匹配项目   在尝试用较少的排列之前   前一项的匹配,最多为   前一项的位置   根本不匹配。

答案 1 :(得分:6)

假设Java正则表达式支持它,请使用非贪婪模式.*?而不是贪婪.*,以便它尽快结束捕获而不是迟到了。

如果语言不支持,那么你可以通过简单地检查任何不是结束分隔符的东西来近似它,如下所示:

#[^#]*#

答案 2 :(得分:2)

默认情况下,正则表达式为“贪婪”,也就是说,它们将匹配尽可能多的文本。在您的示例中,“#。*#”模式转换为

  • 匹配“#”
  • 匹配尽可能多的字符,这样你仍然可以......
  • ...匹配“#”

您想要的是“非贪婪”或“不情愿”模式,例如“*?”。在你的情况下尝试“#。*?#”。