java中 String.matches方法为何不常出现
在学习中经常看到正则表达式的匹配都用Pattern实现,使用正则表达式需要引入 java.util.regex 包,并用到三个类:Pattern 类、Matcher 类和异常类PatternSyntaxException。例如:
boolean flag1 = input.matches(regex);
boolean flag2 = Pattern.matches(regex, input);
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
boolean flag3 = m.matches();
从实现效果上来讲,三种匹配方法应该是等价的,但当观察别人写的博客代码时,大家往往不用字符串自带的matches方法,这就比较疑惑。
查找资料后得出的原因是:使用Pattern是为了更好的性能。
参考https://www.cnblogs.com/lccsblog/p/10988928.html
String内部为正则表达式创建了一个Pattern实例,却只用一次, 本质上来说,上示代码flag1和flag3的matches方法都是Mather的matches方法。
创建Pattern的花销很高,所以为了性能和可复用性,将Pattern在匹配前先行创建是编程好习惯。
关于上示代码的另外一些小知识点:
1.Matcher对象的matches方法是对整个序列的匹配,“fooo”.matches(“foo”);的结果是false,因为少一个o,整序列不匹配。
而Matcher对象的lookingAt方法则可以开头匹配,“fooo”.lookingAt(“foo”);的结果是true,只要开头匹配就行。
2.java中正则表达式的使用语法:特殊的转义符 \ 。在其他语言中,比如c语言,“\“就表示插入一个\符号;但java正则表达式里表示一个\符号却需要”\\”。因为java中\ 表示"插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义"。所以这也就是为什么java表示一位数字的正则表达式是 \d,而我们学习普通正则表达式的时候却只用\d表示。