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

java 如何用pattern 和 Matcher 来使用正则表达式的更多相关文章

  1. java 如何用pattern 和 Matcher 来使用正则表达式(一)

    近期用到了java或者scala的正则表达式的用法,抽点时间总结一下: 转自:https://www.cnblogs.com/haodawang/p/5967219.html java的regex库 ...

  2. java.util.regex.Pattern正则表达式写验证器示例

    import java.util.regex.Pattern; /** * 校验器:利用正则表达式校验邮箱.手机号等 * */ public class Validator { /** * 正则表达式 ...

  3. JAVA 正则 Pattern 和 Matcher

    java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 1.简介:  java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. ...

  4. java正则表达式Pattern和Matcher

    java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 1.简介:  java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. ...

  5. Java基础知识强化77:正则表达式之获取功能(Pattern 和 Matcher类的使用)

    1. 获取功能: Pattern 和 Matcher类结合使用 2. 使用案例: package cn.itcast_05; import java.util.regex.Matcher; impor ...

  6. java Pattern和Matcher详解

    结论:Pattern与Matcher一起合作.Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持. 单独用Pattern只能使用Pattern.matcher(String ...

  7. 【java】java.util.regex.Pattern和java.util.regex.Matcher简单示例

    package 正则; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test_regex ...

  8. JAVA正则表达式 Pattern和Matcher

    java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 1.简介:  java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. ...

  9. 关于java中Pattern和Matcher区别于联系

    本文章转自: http://blog.csdn.net/cclovett/article/details/12448843 结论:Pattern与Matcher一起合作.Matcher类提供了对正则表 ...

随机推荐

  1. JavaScript之DOM概念

    一.DOM概念 1.DOM是什么? 1.1 起源.DOM起源于Netscape与Microsoft 公司的DHTML(动态HTML). 1.2 名词解释.Document Object Model,文 ...

  2. 第4月第10天 iOS项目 mvc

    1. 一个uiviewcontroller发送网络请求,解析数据后放在数组里.如果是多个网络请求,就要多个成员变量存储.那是不是可以单独出一个model来解析数据,存储数据呢. 如果有一个Reques ...

  3. java的一维数组

    数组的基础知识: 数组一旦创建,它的的大小是固定的.使用一个数组引用变量,通过下标来访问数组中的元素. 初始化数组的方法: 复制数组的方法: 1.使用循环语句逐个地复制数组的元素 2.使用System ...

  4. Mask RCNN 学习笔记

    下面会介绍基于ResNet50的Mask RCNN网络,其中会涉及到RPN.FPN.ROIAlign以及分类.回归使用的损失函数等 介绍时所采用的MaskRCNN源码(python版本)来源于GitH ...

  5. pytorch官网上两个例程

    caffe用起来太笨重了,最近转到pytorch,用起来实在不要太方便,上手也非常快,这里贴一下pytorch官网上的两个小例程,掌握一下它的用法: 例程一:利用nn  这个module构建网络,实现 ...

  6. ARMV8 datasheet学习笔记3:AArch64应用级体系结构

    1.前言 本文主要从应用的角度介绍ARMV8的编程模型和存储模型 2. AArch64应用级编程模型 从应用的角度看到的ARM处理器元素: 可见的元素(寄存器/指令) 说明 可见的寄存器 R0-R30 ...

  7. Linux 文件系统扩展属性【转】

    转自:https://blog.csdn.net/ganggexiongqi/article/details/7661024 扩展属性(xattrs)提供了一个机制用来将<键/值>对永久地 ...

  8. Expm 9_2 有向图的强连通分量问题

      [问题描述] 给定一个有向图,设计一个算法,求解并输出该图的各个强连通分量. package org.xiu68.exp.exp9; import java.util.ArrayList; imp ...

  9. 了解的CAP和BASE等理论

    CAP,BASE和最终一致性是NoSQL数据库存在的三大基石.而五分钟法则是内存数据存储的理论依据.这个是一切的源头. 几个名词解释: 网络分区:俗称“脑裂”.当网络发生异常情况,导致分布式系统中部分 ...

  10. PhpStrom添加调试功能

    要给PhpStrom添加调试功能,需要安装Xdebug,网址:https://xdebug.org/ 1.如何下载对应thinkphp版本号的Xdebug呢 创建一个php文件,在里面输入phpinf ...