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每执行一次就编译一次正则表达式,因此建议将需要的正则表达式进行预编译。)

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

总结

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

(0)

相关推荐

  • JAVA正则表达式 Pattern和Matcher

    1.简介: java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式. Matcher 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查. 首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字

  • Java matches类,Pattern类及matcher类用法示例

    本文实例讲述了Java matches类,Pattern类及matcher类用法.分享给大家供大家参考,具体如下: Pattern类 正则表达式常见规则 A:字符     x 字符 x.举例:'a'表示字符a     \\ 反斜线字符.     \n 新行(换行)符 ('\u000A')     \r 回车符 ('\u000D') B:字符类     [abc] a.b 或 c(简单类),其中一个     [^abc] 任何字符,除了 a.b 或 c(否定)     [a-zA-Z] a到 z

  • 详解Java正则表达式中Pattern类和Matcher类

    前言 本文将介绍Java正则表达式中的Pattern类与Matcher类.首先我们要清楚指定为字符串的正则表达式必须首先被编译为pattern类的实例.因此如何更好的了解这两个类,是编程人员必须知道的. 以下我们就分别来看看这两个类: 一.捕获组的概念 捕获组可以通过从左到右计算其开括号来编号,编号是从1 开始的.例如,在表达式 ((A)(B(C)))中,存在四个这样的组: 1 ((A)(B(C))) 2 (A) 3 (B(C)) 4 (C) 组零始终代表整个表达式. 以 (?) 开头的组是纯的

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

    此篇文章是记录我在学习Java正则表达式时候学到的和遇到的坑. 先来说说 Matcher 里面的三个方法(取的结果以group()方法为例子) matches():整个匹配,只有整个字符序列完全匹配成功,才返回True,否则返回False.但如果前部分匹配成功,将移动下次匹配的位置.举个例子如果字符串为"a123",正则表达式为"\w\d\d\d",则matches()方法才返回true,换言之,就是要匹配的字符串需要跟正则表达式一一对应,字母对应字母,数字对应数字

  • java正则表达式之Pattern与Matcher类详解

    Pattern.split方法详解 /** * 测试Pattern.split方法 */ @Test public void testPatternSplit() { String str = "{0x40, 0x11, 0x00, 0x00}"; // 分割符为:逗号, {,}, 空白符 String regex = "[,\\{\\}\\s]"; Pattern pattern = Pattern.compile(regex); /* * 1. split 方法

  • Java Pattern与Matcher字符串匹配案例详解

    Pattern类定义          public final class Pattern extends Object implementsSerializable正则表达式的编译表示形式.用于编译正则表达式后创建一个匹配模式.         指定为字符串的正则表达式必须首先被编译为此类的实例.然后,可将得到的模式用于创建Matcher对象,依照正则表达式,该对象可以与任意字符序列匹配.执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式.         因此,典型的

  • Java正则表达式Pattern和Matcher原理详解

    这篇文章主要介绍了Java正则表达式Pattern和Matcher原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 基本使用 Scanner中的使用正则表达式 //Scanner 支持的分组 Scanner cin=new Scanner("red a bbc").useDelimiter("\\s*a\\s*"); System.out.println(cin.next()); System.out.pri

  • Java Pattern和Matcher字符匹配方式

    目录 Pattern类定义 因此,典型的调用顺序是: Pattern类方法详解 Pattern类使用示例: Matcher类定义 Matcher类方法详解 1.Matcher类提供了三个匹配操作方法 2.返回匹配器的显示状态 3.int start(),int end(),int group()均有一个重载方法 4.Matcher类同时提供了四个将匹配子串替换成指定字符串的方法: 5.其他一些方法: 应用实例 Pattern类定义 public final class Pattern exten

  • java日期相关类实例详解

    一.Date类 类 Date 表示特定的瞬间,精确到毫秒.用距离1970年1月1日00:00:00的毫秒数(long)类型来表示一个特定的时间点,该值可正可负. Date类中很多方法已经过时,使用Calendar来替代. 常用方法有 long getTime() void setTime(long time) public class T01Date { public static void main(String[] args) { //getTime():返回的时间是距离1970年的毫秒数.

  • java正则匹配读取txt文件提取特定开头和结尾的字符串

    目录 前言 一.使用FileInputStream处理 二.使用正则开始匹配 1.匹配规则书写 2.pattern 代码案例 总结 前言 前天刚入职的算法同事,过来问我怎么提取txt文件中的数据,我一看这还不简单,结果…搞了好久. 正则不用真的会忘记,写篇博客增加一下记忆吧. 需求:提取txt文件中,有特定开头(双引号) ,特定结尾(双引号) 的中间的数据,打印出来 一.使用FileInputStream处理 FileInputStream:是java中的字节输入流,就是通过字节的形式进行读取

随机推荐