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

Kes*_*hav 1 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);
        }       
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Tom*_*lak 6

#[^#]+#

虽然考虑到这一点,但由于相当明显的原因,哈希标志对于分隔URL是一个不好的选择.

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

[明星]重复前一项零次或多次.贪婪,因此在尝试使用前一项的较少匹配的排列之前将匹配尽可能多的项目,直到前一项目根本不匹配的点.


Amb*_*ber 6

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

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

#[^#]*#
Run Code Online (Sandbox Code Playgroud)