zoukankan      html  css  js  c++  java
  • java 如何用pattern 和 Matcher 来使用正则表达式

    java的regex库

    java里预留了一个regex库,方便于我们在java里操作正则表达式,或者用它来匹配字符串。

    其中比较常用的就是 Pattern 和 Matcher ,pattern是一个编译好的正则表达式,而Mather是一个正则表达式适配器,Mather的功能很强大,所以我们一般用pattern 来获取一个Matcher对象,然后用Matcher来操作正则表达式。先看一下这两个类的用法吧、

    Pattern

    创建pattern的对象是很简单的,但是由于pattern的构造方法是用private声明的,所以我们仅能通过工厂模式的compile方法来返回一个Pattern的对象。

    Pattern pattern = Pattern.compile("[abc]");
    

    compile可以接收一个正则表达式作为参数。

    接下来我们创建一个Matcher对象。Matcher的构造方法也是一个private方法,但是我们可以通过Pattern的Matcher方法来返回一个Matcher对象。

    Matcher matcher = pattern.matcher("hello abc");
    

    这里matcher可以接收一个字符串作为参数,准确的说这里所接收的参数类型是CharSequences接口类型的参数,但是String、StringBuffer、StringBuilder还有CharBuffer都实现了CharSequence接口,因此我们向里面传入这四种任何我们需要的参数。

    与此同时Pattern还提供了一个matches 静态方法,它允许我们传入一个String类型的正则表达式和一个String类型的需要匹配的字符串,并返回一个boolean类型的值,这个方法的好处在于我们可以不用创建pattern对象和matcher对象就可以知道所传入的正则表达式能不能匹配所传入的字符串。

    boolean bool = Pattern.matches("\w+","hello abc");
    

    Watcher

    说到Wather,这个东西就很强大了,我们比较常用的方法有:

    find();
    group();

    (1)先来说一下find()和group这两个方法。
    find有点像一个迭代器,它能通过正则表达式向前迭代。
    下来看一个例子

    public class Main {
    	public static void main(String[] args){
    		Pattern pattern = Pattern.compile("\w+");
    		Matcher matcher = pattern.matcher("hello abc bbc cbc ccc");
    		//find向前迭代
    		while(matcher.find()){
    			System.out.println(matcher.group());
    		}
    	}
    }
    

    我们先来看看jdk给出的api怎么定义find的;
    boolean find();
    可以知道find返回的是一个boolean值,当前方没有内容的时候,find会返回false,所以我们这里可以直接用while来写,这句代码打印出的内容是

    hello
    abc
    bbc
    cbc
    ccc
    
    

    可以看到其实我们的正则表达式"\w+"只匹配到了第一个单词hello ,但是因为find迭代的关系,把后面的单词全部都打印出来了,参照的正是我们给出的正则表达式。

    (2)group
    说到find就不得不说group。
    下面看个式子

    (a(b)(c(d)))

    这里的话我们把整个式子称为第0组,
    第一组是 a(b)(c(d))
    第二组是 子式 b 和 子式c(d)
    第三组是 d

    看一下几个group方法
    int groupCount()
    返回此匹配器模式中的捕获组数
    这个方法也就是返回所匹配的字符串的组数。

    public class Main {
    	public static void main(String[] args){
    		Pattern pattern = Pattern.compile("(\w+)\d+");
    		Matcher matcher = pattern.matcher("hello123 abc bbc cbc ccc");
    		matcher.find();
    		System.out.println(matcher.groupCount());
    	}
    }
    

    这里匹配到的是hello123, 当然不加()也能得到,这里只是为了方便演示。
    打印出来的数值是1,这是因为我们只有一个组

    那group();呢

    String group()
    返回由以前匹配操作所匹配的输入子序列。

    也就是说group是返回所匹配到的第0组的值,返回值是一个String。这也能解释我们刚刚用find进行迭代的那个例子了。

    public class Main {
    	public static void main(String[] args){
    		Pattern pattern = Pattern.compile("\w+");
    		Matcher matcher = pattern.matcher("hello abc bbc cbc ccc");
    		//find向前迭代
    		while(matcher.find()){
    			System.out.println(matcher.group());
    		}
    	}
    }
    

    这里没有分组所以直接将匹配到的String打印出来,其实也就是第0组.

    另外 group还有个重载的方法,可以接收一个int类型的参数

    String group(int group)
    返回在以前匹配操作期间由给定组捕获的输入子序列。
    传入的参数正是组数.

    public class Main {
    	public static void main(String[] args){
    		Pattern pattern = Pattern.compile("(\w+)\s\d+");
    		Matcher matcher = pattern.matcher("hello 123 abc bbc cbc ccc");
    		matcher.find();
    		System.out.println(matcher.group(1));
    	}
    }
    

    打印出来的结果正在我们的意料之中是hello。

    除此之外还有两个可以返回匹配当前字符串的索引的方法。

    int start();
    int end();

    其中start是返回匹配成功的子串的第一个字母的索引,而end是返回子串最后一个索引的位置+1.

    String input = "hello abc BBc Cbc ccc";
    		Matcher matcher = Pattern.compile("[A-Z][A-Z]\w").matcher(input);
    		matcher.find();
    		System.out.println(input.charAt(matcher.start()));
    

    这里打印出来的值是B。但是如果我们换成end就不一样了。

    System.out.println(input.charAt(matcher.end()));
    

    这里打印出来的值却是“ ”是一个空字符,也就是c的索引加了1,所以我们这里只需稍作修改便可以打印出c了。

    System.out.println(input.charAt(matcher.end()-1));
    

    java的regex库

    java里预留了一个regex库,方便于我们在java里操作正则表达式,或者用它来匹配字符串。

    其中比较常用的就是 Pattern 和 Matcher ,pattern是一个编译好的正则表达式,而Mather是一个正则表达式适配器,Mather的功能很强大,所以我们一般用pattern 来获取一个Matcher对象,然后用Matcher来操作正则表达式。先看一下这两个类的用法吧、

    Pattern

    创建pattern的对象是很简单的,但是由于pattern的构造方法是用private声明的,所以我们仅能通过工厂模式的compile方法来返回一个Pattern的对象。

    Pattern pattern = Pattern.compile("[abc]");
    

    compile可以接收一个正则表达式作为参数。

    接下来我们创建一个Matcher对象。Matcher的构造方法也是一个private方法,但是我们可以通过Pattern的Matcher方法来返回一个Matcher对象。

    Matcher matcher = pattern.matcher("hello abc");
    

    这里matcher可以接收一个字符串作为参数,准确的说这里所接收的参数类型是CharSequences接口类型的参数,但是String、StringBuffer、StringBuilder还有CharBuffer都实现了CharSequence接口,因此我们向里面传入这四种任何我们需要的参数。

    与此同时Pattern还提供了一个matches 静态方法,它允许我们传入一个String类型的正则表达式和一个String类型的需要匹配的字符串,并返回一个boolean类型的值,这个方法的好处在于我们可以不用创建pattern对象和matcher对象就可以知道所传入的正则表达式能不能匹配所传入的字符串。

    boolean bool = Pattern.matches("\w+","hello abc");
    

    Watcher

    说到Wather,这个东西就很强大了,我们比较常用的方法有:

    find();
    group();

    (1)先来说一下find()和group这两个方法。
    find有点像一个迭代器,它能通过正则表达式向前迭代。
    下来看一个例子

    public class Main {
    	public static void main(String[] args){
    		Pattern pattern = Pattern.compile("\w+");
    		Matcher matcher = pattern.matcher("hello abc bbc cbc ccc");
    		//find向前迭代
    		while(matcher.find()){
    			System.out.println(matcher.group());
    		}
    	}
    }
    

    我们先来看看jdk给出的api怎么定义find的;
    boolean find();
    可以知道find返回的是一个boolean值,当前方没有内容的时候,find会返回false,所以我们这里可以直接用while来写,这句代码打印出的内容是

    hello
    abc
    bbc
    cbc
    ccc
    
    

    可以看到其实我们的正则表达式"\w+"只匹配到了第一个单词hello ,但是因为find迭代的关系,把后面的单词全部都打印出来了,参照的正是我们给出的正则表达式。

    (2)group
    说到find就不得不说group。
    下面看个式子

    (a(b)(c(d)))

    这里的话我们把整个式子称为第0组,
    第一组是 a(b)(c(d))
    第二组是 子式 b 和 子式c(d)
    第三组是 d

    看一下几个group方法
    int groupCount()
    返回此匹配器模式中的捕获组数
    这个方法也就是返回所匹配的字符串的组数。

    public class Main {
    	public static void main(String[] args){
    		Pattern pattern = Pattern.compile("(\w+)\d+");
    		Matcher matcher = pattern.matcher("hello123 abc bbc cbc ccc");
    		matcher.find();
    		System.out.println(matcher.groupCount());
    	}
    }
    

    这里匹配到的是hello123, 当然不加()也能得到,这里只是为了方便演示。
    打印出来的数值是1,这是因为我们只有一个组

    那group();呢

    String group()
    返回由以前匹配操作所匹配的输入子序列。

    也就是说group是返回所匹配到的第0组的值,返回值是一个String。这也能解释我们刚刚用find进行迭代的那个例子了。

    public class Main {
    	public static void main(String[] args){
    		Pattern pattern = Pattern.compile("\w+");
    		Matcher matcher = pattern.matcher("hello abc bbc cbc ccc");
    		//find向前迭代
    		while(matcher.find()){
    			System.out.println(matcher.group());
    		}
    	}
    }
    

    这里没有分组所以直接将匹配到的String打印出来,其实也就是第0组.

    另外 group还有个重载的方法,可以接收一个int类型的参数

    String group(int group)
    返回在以前匹配操作期间由给定组捕获的输入子序列。
    传入的参数正是组数.

    public class Main {
    	public static void main(String[] args){
    		Pattern pattern = Pattern.compile("(\w+)\s\d+");
    		Matcher matcher = pattern.matcher("hello 123 abc bbc cbc ccc");
    		matcher.find();
    		System.out.println(matcher.group(1));
    	}
    }
    

    打印出来的结果正在我们的意料之中是hello。

    除此之外还有两个可以返回匹配当前字符串的索引的方法。

    int start();
    int end();

    其中start是返回匹配成功的子串的第一个字母的索引,而end是返回子串最后一个索引的位置+1.

    String input = "hello abc BBc Cbc ccc";
    		Matcher matcher = Pattern.compile("[A-Z][A-Z]\w").matcher(input);
    		matcher.find();
    		System.out.println(input.charAt(matcher.start()));
    

    这里打印出来的值是B。但是如果我们换成end就不一样了。

    System.out.println(input.charAt(matcher.end()));
    

    这里打印出来的值却是“ ”是一个空字符,也就是c的索引加了1,所以我们这里只需稍作修改便可以打印出c了。

    System.out.println(input.charAt(matcher.end()-1));
    

    matcher 和 lookingAt

    这两个方法都返回一个boolean值,不同的是matcher是将整个输入序列拿去匹配,而lookingAt一旦匹配成功一个子串就返回true。

    public class Main {
    	public static void main(String[] args){
    		String s="aaaaaaaaaabbbbbbbbb";
    		Matcher matcher = Pattern.compile("a+").matcher(s);
    		System.out.println(matcher.lookingAt());//true
    	}
    }
    

    这里匹配到的是aaaaaaaaaaa,因为用的是lookingAt,所以直接返回true了

    如果换做是matches()。

    System.out.println(matcher.matches());//false
    

    即返回false

  • 相关阅读:
    MySQL导出数据库、数据库表结构、存储过程及函数
    个人支付接口
    C# WPF,XAML 跨平台应用框架
    uniapp 第三方组件库
    C语言图形界面库
    微信小程序 获取cookie 以及设置 cookie
    stm32资源网
    找最长连续重复字母子串
    asp .net web api Swagger简单实用
    跨域问题
  • 原文地址:https://www.cnblogs.com/haodawang/p/5967219.html
Copyright © 2011-2022 走看看