天问

java正则表达式并不标准介绍

问题描述:

假设有一个网站链接 http://xx.com ,通过 http 字符串来做正则搜索,代码如下:

	public static void main(String[] args) {
		String pattern = "http";
		String urlString = "http://xx.com";
		System.out.println(Pattern.matches(pattern, urlString));
	}

上面代码很简单就是 Pattern.matches(pattern, urlString) 判断是否匹配到了,匹配到了返回True,否则返回False。

很明显,http://xx.com 中包含 http,所以结果应返回 True,但是结果却是False:

代码很简单,就是类似于通过java正则表达式判断,在abcd里面查找是否有ab。结果却说没找到,什么情况?

Notepad++中我们也可以通过上面的正则表达式来搜索:

或者换一种编程语言,Python正则比较:

import re
print(re.match('http', 'http://xx.com'))

都能正确匹配,所以正则表达式没问题,有问题的是java语言。

问题分析

那么在其他语言中并没有错误,而java出问题了。原因是什么呢?该如何进行正则匹配呢?

我把正则表达式改为上面截图中标注的即可返回 True,当然这个正则表达式在其他语言也同样返回True。 .* 在正则表达式中表示任意多个字符。

所以问题是什么呢?

java的正则表达式并非标准的正则匹配,Pattern.matches(pattern, urlString) 这个matches()函数只有在patern完全匹配整个字符urlString 的时候才返回True。

后记

在 java 正则表达式使用时候,多做单元测试。各种编程语言都有奇葩问题。

博客地址:http://blog.yoqi.me/?p=17269
扫我捐助哦
喜欢 1

这篇文章还没有评论

发表评论