Java正则相关的Pattern和Matcher类及遇到的坑

 更新时间:2019-09-09 13:01:30   作者:佚名   我要评论(0)

此篇文章是记录我在学习Java正则表达式时候学到的和遇到的坑。
先来说说 Matcher 里面的三个方法(取的结果以group()方法为例子)

matches():整个匹配,只

此篇文章是记录我在学习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每执行一次就编译一次正则表达式,因此建议将需要的正则表达式进行预编译。)

正则表达式学习教程: http://deerchao.net/tutorials/regex/regex.htm ,文中作者写得挺详细的,并且通俗易懂。

总结

以上所述是小编给大家介绍的Java正则相关的Pattern和Matcher类及遇到的坑,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

您可能感兴趣的文章:

  • 详解Java正则表达式中Pattern类和Matcher类
  • JAVA正则表达式 Pattern和Matcher
  • Java matches类,Pattern类及matcher类用法示例

相关文章

  • Java正则相关的Pattern和Matcher类及遇到的坑

    Java正则相关的Pattern和Matcher类及遇到的坑

    此篇文章是记录我在学习Java正则表达式时候学到的和遇到的坑。 先来说说 Matcher 里面的三个方法(取的结果以group()方法为例子) matches():整个匹配,只
    2019-09-09
  • 浅谈pycharm使用及设置方法

    浅谈pycharm使用及设置方法

    一、Pycharm 是什么? PyCharm是一种PythonIDE,其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。 二、pycharm 的安装 1.下载 : 地址http
    2019-09-09
  • 一起因MySQL时间戳精度引发的血案分析

    一起因MySQL时间戳精度引发的血案分析

    写在前面 最近工作中遇到两例mysql时间戳相关的问题,一个是mysql-connector-java和msyql的精度不一致导致数据查不到;另一例是应用服务器时区错误导致数据查
    2019-09-09
  • php常用经典函数集锦【数组、字符串、栈、队列、排序等】

    php常用经典函数集锦【数组、字符串、栈、队列、排序等】

    本文实例总结了php常用经典函数。分享给大家供大家参考,具体如下: 数组函数 数组操作 range(start,end) 创建一个数组,值从start开始,一直到end结束
    2019-09-09
  • Spring事务管理方法步骤解析

    Spring事务管理方法步骤解析

    1、Spring的事务管理主要包括3个接口 TransactionDefinition:封装事务的隔离级别,超时时间,是否为只读事务和事务的传播规则等事务属性,可通过XML配置具体信
    2019-09-09
  • Nginx实现负载均衡的方法总结

    Nginx实现负载均衡的方法总结

    要理解负载均衡,必须先搞清楚正向代理和反向代理。 注: 正向代理,代理的是用户。 反向代理,代理的是服务器 什么是负载均衡 当一台服务器的单位时
    2019-09-09
  • PyCharm2018 安装及破解方法实现步骤

    PyCharm2018 安装及破解方法实现步骤

    PyCharm就是Python语言开发中一个很受欢迎的IDE,界面类似于visual studio,android studio,集成的功能也很多。 1>. 安装 首先要下载Pycharm这个软件,可以在
    2019-09-09
  • Spring 面向切面编程AOP实现详解

    Spring 面向切面编程AOP实现详解

    简介 1、什么叫做面向切面编程? 概念:把一个个的横切关注点(某种业务的实现代码)放到某个模块中去,称之为切面。每个切面影响业务的一种功能,切面的
    2019-09-09
  • 微信小程序HTTP请求从0到1封装

    微信小程序HTTP请求从0到1封装

    前言 作为一个前端开发者,从最开始的js、jQuery一把梭,后来的vue、react、angular等MVVM、MVC框架,我们在开发工程中都离不开HTTP库的使用。 HTTP库
    2019-09-09
  • Yii框架日志操作图文与实例详解

    Yii框架日志操作图文与实例详解

    本文实例讲述了Yii框架日志操作。分享给大家供大家参考,具体如下: 将日志记录到文本中. Yii::log("test"); //写入测试日志 //找到配置文件
    2019-09-09

最新评论