java正则预编译_Java正则相关的Pattern和Matcher类及遇到的坑

此篇文章是记录我在学习java正则表达式时候学到的和遇到的坑。

先来说说 matcher 里面的三个方法(取的结果以group()方法为例子)

matches():整个匹配,只有整个字符序列完全匹配成功,才返回true,否则返回false。但如果前部分匹配成功,将移动下次匹配的位置。举个例子如果字符串为"a123",正则表达式为"\w\d\d\d",则matches()方法才返回true,换言之,就是要匹配的字符串需要跟正则表达式一一对应,字母对应字母,数字对应数字,所以称之为完全匹配,错一位都不行。(这里的理解花了我好长时间,网上搜到的都没有提及,也许是我理解能力不够)

find():部分匹配,从当前位置开始匹配,找到一个匹配的子串,将移动下次匹配的位置。“find()像迭代器那样向前遍历输入字符串。” --摘自《java编程思想。看下面的例子中的find()方法,要匹配的字符串为"a123b",正则表达式为"\d\d\d",而最后输出结果为:123,所以称之为部分匹配,只要有,就返回true。

lookingat():部分匹配,总是从第一个字符进行匹配,匹配成功了不再继续匹配,匹配失败了,也不继续匹配。lookingat()方法介于matches()和find()方法之间。lookingat()方法的部分匹配指从第一位开始匹配如果第一位没有匹配到,就不再匹配,直接返回false,如果第一位匹配到了,则匹配第二位,以此类推。例子:要匹配的字符串为"a123b",正则表达式为"\w\d\d",输出结果为"a12",很好理解,就是一位一位地匹配,匹配到了就匹配下一位。"\w\d\d"这个正则正好代表"字母数字数字",所以正好输出结果为a12。

好了上测试代码:

package com.wjj.utils;

import java.util.regex.matcher;

import java.util.regex.pattern;

/**

* @author 作者 : 榨菜哥

* @version 创建时间:2016年8月18日 上午8:47:58

* 类说明:正则表达式的练习

*/

public class regex {

//find方法测试

public static void find(string html) {

string regex = "\\d\\d\\d";

pattern pattern = pattern.compile(regex, pattern.case_insensitive);

matcher matcher = pattern.matcher(html);

system.out.print("find():");

if (matcher.find()) {

system.out.println(matcher.group());

}

}

//matches方法测试

public static void matches(string html) {

string regex = "^\\w\\d\\d\\d";

pattern pattern = pattern.compile(regex, pattern.case_insensitive);

matcher matcher = pattern.matcher(html);

system.out.print("matches():");

if (matcher.matches()) {

system.out.println(matcher.group());

}

}

//lookingat方法测试

public static void lookingat(string html) {

string regex = "\\w\\d\\d";

pattern pattern = pattern.compile(regex, pattern.case_insensitive);

matcher matcher = pattern.matcher(html);

system.out.print("lookingat():");

if (matcher.lookingat()) {

system.out.println(matcher.group());

}

}

public static void main(string[] args) {

//find方法测试

find("a123b");

//matches方法测试

matches("a123");

//lookingat方法测试

lookingat("a123b");

}

}

输出结果:

find():123

matches():a123

lookingat():a12

小结:正则表达式本身并不难,平常使用的时候只要按照规则来写就好了。在学习中理解matches、find、和lookingat三个方法花了我比较长的时间,一直不能理解完全匹配和部分匹配是什么意思,最后还是在stackoverflow上找到了想要的答案。

以上是个人学习的理解,有不对之处,希望给予指点。

(补充:正则表达式pattern如果调用多次容易出问题,比如内存溢出,因为pattern每执行一次就编译一次正则表达式,因此建议将需要的正则表达式进行预编译。)

正则表达式学习教程:  ,文中作者写得挺详细的,并且通俗易懂。

总结

以上所述是小编给大家介绍的java正则相关的pattern和matcher类及遇到的坑,希望对大家有所帮助

希望与广大网友互动??

点此进行留言吧!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值