java 如何用pattern 和 Matcher 来使用正则表达式(一)
近期用到了java或者scala的正则表达式的用法,抽点时间总结一下;
转自:https://www.cnblogs.com/haodawang/p/5967219.html
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 来使用正则表达式(一)的更多相关文章
- java 如何用pattern 和 Matcher 来使用正则表达式
java的regex库 java里预留了一个regex库,方便于我们在java里操作正则表达式,或者用它来匹配字符串. 其中比较常用的就是 Pattern 和 Matcher ,pattern是一个编 ...
- java.util.regex.Pattern正则表达式写验证器示例
import java.util.regex.Pattern; /** * 校验器:利用正则表达式校验邮箱.手机号等 * */ public class Validator { /** * 正则表达式 ...
- JAVA 正则 Pattern 和 Matcher
java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 1.简介: java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. ...
- java正则表达式Pattern和Matcher
java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 1.简介: java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. ...
- Java基础知识强化77:正则表达式之获取功能(Pattern 和 Matcher类的使用)
1. 获取功能: Pattern 和 Matcher类结合使用 2. 使用案例: package cn.itcast_05; import java.util.regex.Matcher; impor ...
- java Pattern和Matcher详解
结论:Pattern与Matcher一起合作.Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持. 单独用Pattern只能使用Pattern.matcher(String ...
- 【java】java.util.regex.Pattern和java.util.regex.Matcher简单示例
package 正则; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test_regex ...
- JAVA正则表达式 Pattern和Matcher
java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 1.简介: java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. ...
- 关于java中Pattern和Matcher区别于联系
本文章转自: http://blog.csdn.net/cclovett/article/details/12448843 结论:Pattern与Matcher一起合作.Matcher类提供了对正则表 ...
随机推荐
- Java还是编程语言中的老大?凭什么长期霸占第一宝座?
首先,Java语言之所以能够迅速在科技行业内普及,一个重要的原因是Java语言的出现恰好契合了Web时代对于编程语言的要求,可以说Java语言的大流行是互联网时代发展的必然结果,虽然Java自身有诸多 ...
- eclipse的debug模式的F5,F6按键失灵
在使用eclipse Mars.1 Release (4.5.1)开发过程中,发现debug模式下的快捷键无法使用,全部失效了.秉持坚决自己解决绝不求人的态度我艰苦的在度娘上寻求解决办法,有的说是快捷 ...
- EF Core 迁移整理
创建迁移 PowerShell Add-Migration InitialCreate 多数据源 Add-Migration InitialCreate -Context MyDbContext -O ...
- C# 连接数据库的配置方法
写在前面 在项目的开发过程中我门常常遇到会忘记数据库连接的配置的写法的尴尬处境.俗话说,好记性不如烂笔头.所以,mark一下. 1.Sqlserver数据库连接 <connectionStrin ...
- 类例程_c#战斗程序(窗体版)
战士类代码: class Fight { String name; int attack, speed, crit, armor;// 生命.攻击力,攻速,暴击,护甲 public int life; ...
- Python删除列表元素的3种方法
之前看教程的时候比较着急,对这些基础掌握不好,过来回顾一下 使用del语句删除 lis = [1, 2, 3, 'a', 'b'] print(lis) del lis[0] print(lis) 输 ...
- 关于Mysql datetime类型存储范围测试
创建一个datetime表 > create table date_time(time datetime); > desc date_time; +-------+----------+- ...
- 浏览器标签页切换时jquery动画的问题
最近公司在做大屏设备上的页面,其中动画的部分居多,开始的时候是用的jquery做的动画,在做完后无意中发现jquery动画存在一个问题,就是浏览器在切换标签页后,过段时间切换回来页面中的动画会出现连续 ...
- 基于JPA的分页/排序实现
Page<ClassOrder> findByMember_MemberID(long id, Pageable pageable); Controller代码: public Model ...
- JS 数组克隆方法总结(不可更改原数组)
ES5 方法总结 1.slice let arr = [2,4,434,43]; let arr1= arr.slice();//let arr1 = arr.slice(0); arr[0] = ' ...