Java - 匹配字符串中的特定URL

时间:2016-02-24 00:42:02

标签: java regex string

我必须在这里找到一些非常简单的东西。我正在尝试匹配给定字符串中的确切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

2 个答案:

答案 0 :(得分:1)

您错过了在您尝试匹配的网址中存在问号的事实。问号是一个量词,这意味着它由正则表达式引擎专门处理(这个量词意味着&#34;零或更多的先前识别的原子&#34;)。

您不希望解释该问号;这意味着你的正则表达式应该以不同的方式构建......并且有一种方法:

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 regex一直是所有成功的正则表达式引擎的通用语言。

答案 1 :(得分:0)

除非你有其他意图,否则边界断言和正则表达式的使用似乎与此无关。我建议只使用contains或indexOf使用非正则表达式解决方案。

String url = "http://fonts.googleapis.com/css?family=Montserrat:400,700";
String src = "<link href=\"http://fonts.googleapis.com/css?family=Montserrat:400,700\"";
System.out.println(src.contains(url));