Java 特定url格式的正则表达式

Java 特定url格式的正则表达式,java,regex,string,string-matching,Java,Regex,String,String Matching,我正在尝试获取一个正则表达式以匹配特定的url格式。特别是stackexchange的api URL。例如,我希望两者都匹配: http://api.stackoverflow.com/1.1/questions/1234/answers http://api.physics.stackexchange.com/1.0/questions/5678/answers 在哪里 凡是不加粗的都必须相同。 第一个粗体部分只能由a到z组成,并且可以是一个句号,也可以没有句号。 如果有一个句号,stac

我正在尝试获取一个正则表达式以匹配特定的url格式。特别是stackexchange的api URL。例如,我希望两者都匹配:

http://api.stackoverflow.com/1.1/questions/1234/answers http://api.physics.stackexchange.com/1.0/questions/5678/answers 在哪里

凡是不加粗的都必须相同。 第一个粗体部分只能由a到z组成,并且可以是一个句号,也可以没有句号。 如果有一个句号,stackexchange这个词必须跟在后面,这也会很好。然而,这并不重要。 第二个粗体部分只能是1或0。 最后一个粗体部分只能是数字0到9,并且可以是任意长度 url前后不能有任何内容,甚至连尾部斜杠都不能 ^http://api[.][a-z]+[.]stackexchange?[.]com/1[.][01]/问题/[0-9]+/答案$ ^匹配字符串的开头,$matches行的结尾,[.]是另一种转义点的方法,而不是反斜杠,反斜杠本身需要转义为\\..

^http://api[.][a-z]+[.]stackexchange?[.]com/1[.][01]/问题/[0-9]+/答案$ ^匹配字符串的开头,$matches行的结尾,[.]是另一种转义点的方法,而不是反斜杠,反斜杠本身需要转义为\\

^确保它在输入开始时开始,\\z确保它在输入结束时结束。所有的点都是转义的,所以它们是文字。我:。。。根据URL规范,part使域和方案不区分大小写。[01]仅与字符0或1匹配。[0-9]+匹配一个或多个阿拉伯数字。其余的都是不言自明的


^确保它在输入开始时开始,\\z确保它在输入结束时结束。所有的点都是转义的,所以它们是文字。我:。。。根据URL规范,part使域和方案不区分大小写。[01]仅与字符0或1匹配。[0-9]+匹配一个或多个阿拉伯数字。其余的都是不言自明的。

这个经过测试的Java程序有一个注释的正则表达式,它应该可以做到这一点:

导入java.util.regex.*; 公开课考试{ 公共静态无效字符串[]args{ 字符串s=http://api.stackoverflow.com/1.1/questions/1234/answers; 模式p=Pattern.compile http://api\\.Scheme和api子域。\n+ ?:域备选方案的组。\n+ 堆栈溢出一个或多个\n+ |物理\\.stackexchange或其他\n+ 域备选方案的结束组。\n+ \\.com TLD\n+ /1\\[01]1.0或1.1\n+ /问题/\\d+/回答路径的其余部分。, 模式。评论; 匹配器m=p匹配器; 如果m匹配{ 找到System.out.printMatch。\n; }否则{ System.out.Print未找到匹配项。\n; } } }
这个经过测试的Java程序有一个注释的正则表达式,它应该可以实现以下功能:

导入java.util.regex.*; 公开课考试{ 公共静态无效字符串[]args{ 字符串s=http://api.stackoverflow.com/1.1/questions/1234/answers; 模式p=Pattern.compile http://api\\.Scheme和api子域。\n+ ?:域备选方案的组。\n+ 堆栈溢出一个或多个\n+ |物理\\.stackexchange或其他\n+ 域备选方案的结束组。\n+ \\.com TLD\n+ /1\\[01]1.0或1.1\n+ /问题/\\d+/回答路径的其余部分。, 模式。评论; 匹配器m=p匹配器; 如果m匹配{ 找到System.out.printMatch。\n; }否则{ System.out.Print未找到匹配项。\n; } } }
Java正则表达式中的$不保证结尾匹配。从…起例如,Pattern.compilefoo$将匹配foo\n。在OP的情况下,多行URL是一个奇怪的东西。你是对的。不允许在URL中使用行分隔符,但OP没有明确说明字符串是否已事先验证为URL。需要严格执行的原因是,它还被用作标识另一个对象的标记。有些对象将具有相同的标记,并且它们需要是一致的,否则它们将无法正确分组,换句话说,我需要获取具有特定URL的所有对象,并且有些对象在末尾有一条折线或一个尾随斜杠,因为某些原因它们不会被包括在内。Java正则表达式中的$不保证在末尾有匹配。从…起例如,Pattern.compilefoo$将匹配foo\n。在OP的情况下,多行URL是一个奇怪的东西。你是对的。不允许在URL中使用行分隔符,但OP没有明确说明字符串是否已事先验证为URL。它需要严格的原因是,它还被用作标识URL的标记 其他对象。有些对象将具有相同的标记,并且它们需要是一致的,否则它们将无法正确分组,换句话说,我需要获取具有特定URL的所有对象,并且有些对象的末尾有一条折线或一个尾随斜杠,因为某些原因它们不会被包括在内。
Pattern.compile("^(?i:http://api\\.(?:[a-z]+(?:\\.stackexchange)?)\\.com)/1\\.[01]/questions/[0-9]+/answers\\z")