我正在调试一段代码,其中给出以下字符串
" http://www.xyz.com/classid/17950142?type=mandatory"
应该提取"classid/"
和"?type=mandatory"
之间显示的数字(即数字17950142
使用以下常规expressoin
完成此操作Pattern.compile("^.*" + "http://www.xyz.com/classid/" + "([0-9]+)", Pattern.CASE_INSENSITIVE)
几个问题:
根据我通过googling找到的参考表,^。*基本上意味着匹配字符串开头的任何字符序列,在上面的示例中可能为空。
在java字符串连接发生后,表达式本身看起来像这样。
^.*http://www.xyz.com/classid/([0-9]+)
为什么上述内容与字符串http://www.xyz.com/classid/17950142?type=mandatory
以下是我尝试在Java中运行模式的方法:
Matcher m = PATTERN.matcher(http://www.xyz.com/classid/17950142?type=mandatory);
if(m.matches()) {
return m.group(1);
}
更新
谢谢所有回答。有趣的是,当我使用正则表达式测试程序在线测试时,它似乎正如我期待的那样工作。即使表达式和字符串相同,它也只是在Java中工作。
在此处查看示例 http://regexr.com?37pu3
由于
答案 0 :(得分:2)
您在正则表达式结束时遗漏了$
。试试这个:
String url = "http://www.xyz.com/classid/17950142?type=mandatory";
// ^.*http://www\.xyz\.com/classid/([0-9]+).*$
Pattern regex = Pattern.compile("^.*" + "http://www\\.xyz\\.com/classid/" + "([0-9]+)" + ".*$", Pattern.CASE_INSENSITIVE);
Matcher matcher = regex.matcher(url);
if (matcher.matches())
System.out.println(matcher.group(1));
注意:
^
是一个特殊字符,意味着该模式将开始查看字符串的开头$
与^
相反,意味着它会一直查到字符串的结尾.
和?
字符需要转义。^http://www\.xyz\.com/classid/(\d+).*$
这样的正则表达式更有意义,因为你从头开始检查模式答案 1 :(得分:1)
^。*可能是^ - 字符串的开头,。* - 任何字符的0或更多。
表达式将所有内容与一个后跟数字的网址匹配:([0-9]+)
所以它只是意味着它将匹配以数字结尾的字符串,而不关心之后发生的任何事情。
答案 2 :(得分:1)
看起来问题不在于模式,但我会建议对它进行一些小的修改。
由于您知道您希望域名元素之间存在句点,因此您应该将其转义并使其成为字面句点。你是否真的需要^。*在很大程度上取决于URL在你匹配的字符串中的显示方式:
Pattern p = Pattern.compile("^.*http://www\.xyz\.com/classid/([0-9]+)");
您对模式的使用应该是这样的:
Matcher m = p.matcher("http://www.xyz.com/classid/17950142?type=mandatory");
然后,您可以继续使用条件语句。
使用您原来的方法,但概括了URL模式,我能够得到这个来抓取数字:
Pattern p = Pattern.compile("http://\\S+/([0-9]+)\\?.*");
Matcher m = p.matcher("http://www.ncbi.nlm.nih.gov/pubmed/17950142?dopt=abstract");
if (m.matches()) {
System.out.println(m.group(1));
}