1、 Pattern p = Pattern.compile(参数1);
Matcher m = p.matcher(参数2);
参数值分别去null的情况 和 参数值分别取”"
答:
当把参数1或参数2设置成null的时候,都将会抛出空指针异常,原因如下:
首先了解一下静态方法compile里的源代码为
public static Pattern compile(String regex) {
return new Pattern(regex, 0);
}
该方法返回了一个Pattern实例,那么我们再看看该Pattern的构建函数
private Pattern(String p, int f) {tt
pattern = p;
flags = f;
// Reset group index count
capturingGroupCount = 1;
localCount = 0;
if (pattern.length() > 0) {
compile();
} else {
root = new Start(lastAccept);
matchRoot = lastAccept;
}
}
我们会发现,p是我们刚开始传进来的null值,pattern引用了p
当pattern.length的时候,pattern是个null,空指针异常抛出了.
而matcher方法里和上面的方法情况差不多,依然是执行了给参数取length,造成的空指针异常
当把参数1或参数2传“”时,它是一个空字符串,跟其它普通字符串一样.
2、 为什么p.matcher(参数2);要生成Matcher对象。或者说是Matcher有什么用。
答:根据以下的API,我们可以得到答案
public Matcher matcher(CharSequence input)
创建匹配给定输入与此模式的匹配器。
参数:
input – 要匹配的字符序列。
返回:
此模式的新匹配器。
由此得知,Matcher是一个匹配器,可以执行三种不同的匹配操作,也就是
matches 尝试将整个输入序列与该模式匹配
find 扫描输入序列以查找与该模式匹配的下一个子序列
lookingAt 尝试将输入序列从头开始与该模式匹配
并且Matcher对象里提供了很多好用的方法,可供我们实现更高级的查找替换
3、正则表达式 “(bb)?” 匹配 “” ,”b”,”bbb” 的结果,以及解释。
答:
首先,?号代表的是?号前面的字符串出现零次或一次,
那么”(bb)?”表示字符串bb要出现零次或一次
当出现零次的时候,能匹配到的是个空字符串
当出现一次的时候,能匹配到的是”bb”字符串
那么答案很快就出来了
匹配”",答案当然是true
匹配”b”,答案false
匹配”bbb”,答案false
4、正则表达式写成”**” 或者”x**”等类似的情况。
答:
*,?,+都是正则里的特殊字符
标准的写法是X*,X不能是一个空字符串,
所以”**”或”x**”都将会抛出异常
5、有[a-z]的正则表达式,那[z-a] [a-A]或者[A-a]等相类似的表达式。
答:[a-z]表示一个范围,a和z会转换成ASCII码,范围要遵循从小到大的原则
6、字符串 “” 匹配”[a-z&&[ABC]]” , 以及其他字符串对此正则表达式的匹配。
答:[a-z&&[ABC]]是取a-z与ABC的交集,他们没有任何交集,所以任何字符都不能与他匹配
7、字符串″bbc” 匹配正则表达式 “b^b.”、”b?^b..”等类似的正则表达式。
答:
首先,我们要明白两点:^号在[]外面,表示一行的开头,而在[]里,表示取反
我们可以用下面的一个等式:
“b.”==”^b.”
那么”b^b.”==”^b^b.”,说明是行开头的第一个字符为”bb”,但是”bb”只能表示为两个字符而非一个字符(字符集里应该没有一个字符为”bb”的吧..)
所以任何字符串都不能与它匹配上
而”b?^b..”,b?代表b出现零次或多次,匹配器里为了尽量能让字符串″bbc”与该模式匹配,把b?设定为出现零次,那么后面的^b..就可以与”bbc”相匹配上了
8、email的正则表达式。
答:”[\w[.-]]+@[\w[.-]]+\.[\w]+”
9、用正则区分全角半角。
答:全角范围:[uFF00-uFFFF]
半角范围:[^uFF00-uFFFF](也就是全角的范围取反了)
扩充:
汉字的UNICODE编码范围是4e00-9fa5
汉字范围:[u4E00-u9FA5](那如果取反,就表示不是汉字咯)
0 Responses
Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.