我在这里遗漏了一些非常简单的东西。我正在尝试匹配给定字符串中的确切 URL。代码如下:
String pattern = "\\b.*"+"\"http://fonts.googleapis.com/css?family=Montserrat:400,700\""+"\\b";
Pattern p=Pattern.compile(pattern);
Matcher m=p.matcher("<link href=\"http://fonts.googleapis.com/css?family=Montserrat:400,700\"");
System.out.println(m.find()); // returns false
但是当我尝试获取本地资源时,相同的代码可以工作:
pattern = "\\b.*"+"style.css"+"\\b";
p=Pattern.compile(pattern);
m=p.matcher("<link href=\"css/style.css\"");
System.out.println(m.find()); // returns true
最佳答案
您忽略了这样一个事实:在您尝试匹配的 URL 中,有一个问号。而问号是一个量词,这意味着它被正则表达式引擎特殊对待(这个量词的意思是“零个或多个先前识别的原子”)。
您不希望该问号被解释;这意味着你的正则表达式应该以不同的方式构建......并且有一种方法:
final String quotedUrl
= Pattern.quote("http://fonts.googleapis.com/css?family=Montserrat:400,700");
final String regex = "\\b\"" + quotedUrl + "\"\\b";
final Pattern pattern = Pattern.compile(regex);
// work with the regex
请注意,事实上,Pattern.quote()
仅使用正则表达式特殊序列 \Q
和 \E
包围您的输入。毫不奇怪,这些都是从 Perl 借来的,因为 Perl 正则表达式已经成为迄今为止所有成功的正则表达式引擎的通用语言。
关于Java - 匹配字符串中的特定URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35591169/