我正在尝试使用正则表达式来匹配特定的url格式。特别是stackexchange的api url。例如,我希望这两个匹配:
http://api.stackoverflow.com/1.1/questions/1234/answers http://api.physics.stackexchange.com/1.0/questions/5678/answers
其中
答案 0 :(得分:3)
Pattern.compile("^(?i:http://api\\.(?:[a-z]+(?:\\.stackexchange)?)\\.com)/1\\.[01]/questions/[0-9]+/answers\\z")
^
确保它在输入开始时开始,\\z
确保它在输入结束时结束。所有的点都被转义,因此它们是字面的。 (?i:...)
部分根据URL规范使域和方案不区分大小写。 [01]
仅匹配字符0或1. [0-9]+
匹配1个或多个阿拉伯数字。其余的是自我解释。
答案 1 :(得分:1)
^http://api[.][a-z]+([.]stackexchange)?[.]com/1[.][01]/questions/[0-9]+/answers$
^
匹配字符串的开头,$
匹配行尾,[.]
是一种替代方法来逃避点而不是反斜杠(它本身需要是转义为\\.
)。
答案 2 :(得分:0)
这个经过测试的Java程序有一个注释的正则表达式应该可以解决这个问题:
import java.util.regex.*;
public class TEST {
public static void main(String[] args) {
String s = "http://api.stackoverflow.com/1.1/questions/1234/answers";
Pattern p = Pattern.compile(
"http://api\\. # Scheme and api subdomain.\n" +
"(?: # Group for domain alternatives.\n" +
" stackoverflow # Either one\n" +
"| physics\\.stackexchange # or the other\n" +
") # End group for domain alternatives.\n" +
"\\.com # TLD\n" +
"/1\\.[01] # Either 1.0 or 1.1\n" +
"/questions/\\d+/answers # Rest of path.",
Pattern.COMMENTS);
Matcher m = p.matcher(s);
if (m.matches()) {
System.out.print("Match found.\n");
} else {
System.out.print("No match found.\n");
}
}
}