我尝试使用正则表达式编写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。我可以为此了解正则表达式吗?
答案 0 :(得分:6)
#[^#]+#
虽然考虑到这一点,但由于相当明显的原因,哈希标记是划分网址的不错选择。
你的不起作用的原因是明星的贪婪(来自regular-expressions.info):
[明星]重复上一个项目 零次或多次。贪心,所以很多 尽可能匹配项目 在尝试用较少的排列之前 前一项的匹配,最多为 前一项的位置 根本不匹配。
答案 1 :(得分:6)
假设Java正则表达式支持它,请使用非贪婪模式.*?
而不是贪婪.*
,以便它尽快结束捕获而不是迟到了。
如果语言不支持,那么你可以通过简单地检查任何不是结束分隔符的东西来近似它,如下所示:
#[^#]*#
答案 2 :(得分:2)
默认情况下,正则表达式为“贪婪”,也就是说,它们将匹配尽可能多的文本。在您的示例中,“#。*#”模式转换为
您想要的是“非贪婪”或“不情愿”模式,例如“*?”。在你的情况下尝试“#。*?#”。