JAVA之正则表达式

JAVA之正则表达式

一、简介

正则表达式,又称规则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

简单来说:它是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串。其实就是一种规则。

二、正则表达式的构造摘要

字符类

[abc]a、b 或 c(简单类)
[^abc]任何字符,除了 a、b 或 c(否定)
[a-zA-Z]a 到 z 或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]]a 到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]]d、e 或 f(交集)
[a-z&&[^bc]]a 到 z,除了 b 和 c:[ad-z](减去)
[a-z&&[^m-p]]a 到 z,而非 m 到 p:[a-lq-z](减去)
//[]代表单个字符

 预定义字符类

.任何字符(与行结束符可能匹配也可能不匹配)
\d数字:[0-9]
\D非数字: [^0-9]
\s空白字符:[ \t\n\x0B\f\r]
\S非空白字符:[^\s]
\w单词字符:[a-zA-Z_0-9]
\W非单词字符:[^\w]
//   \代表转义字符,如果想表示\d的话,需要\\d

Greddy 数量词

X?X,一次或一次也没有
X*X,零次或多次
X+X,一次或多次
X{n}X,恰好 n
X{n,}X,至少 n
X{n,m}X,至少 n 次,但是不超过 m

三、简单应用(QQ号码验证)

1:要求必须是5-15位数字  2:0不能开头  3:必须都是数字
String regex = "[1-9]\\d{4,14}";
System.out.println("2553868".matches(regex));     //true
System.out.println("012345".matches(regex));      //false
System.out.println("2553868abc".matches(regex));  //false

四、正则表达式的分割功能

 String[]split(String regex)
          根据给定正则表达式的匹配拆分此字符串。
String s = "123.234.345";
String[] arr = s.split("\\.");				//通过正则表达式切割字符串
for (int i = 0; i < arr.length; i++) {
	System.out.println(arr[i]);
}
/*
*123
*234
*345
*/

五、正则表达式的替换功能

StringreplaceAll(String regex, String replacement)
          使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
String s = "wo111xi222huan3java";
String regex = "\\d";			//\\d代表的是任意数字
String s2 = s.replaceAll(regex, "");
System.out.println(s2);
//woxihuanjava

 六、正则表达式的分组功能

捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:

1    ((A)(B(C)))
2    (A)
3    (B(C))
4    (C)

组零始终代表整个表达式。

案例1: 

        //叠词 快快乐乐,高高兴兴
		String regex = "(.)\\1(.)\\2";//\\1代表第一组又出现一次	\\2代表第二组又出现一次
		System.out.println("快快乐乐".matches(regex));//true
		System.out.println("快乐乐乐".matches(regex));//flase
		System.out.println("高高兴兴".matches(regex));//true
		System.out.println("死啦死啦".matches(regex));//flase
		
        //叠词 死啦死啦,高兴高兴
		String regex2 = "(..)\\1";
		System.out.println("死啦死啦".matches(regex2));//true
		System.out.println("高兴高兴".matches(regex2));//true
		System.out.println("快快乐乐".matches(regex2));//flase

案例2:

        //需求:请按照叠词切割: "sdqqfgkkkhjppppkl";
		String s = "sdqqfgkkkhjppppkl";
		String regex = "(.)\\1+";					//+代表第一组出现一次到多次
		String[] arr = s.split(regex);
		
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}

        /*
        *sd
        *fg
        *hj
        *kl
        */

案例3:

                /*
		 * 需求:我我....我...我.要...要要...要学....学学..学.编..编编.编.程.程.程..程
				将字符串还原成:“我要学编程”。
		 */
		String s = "我我....我...我.要...要要...要学....学学..学.编..编编.编.程.程.程..程";
		String s2 = s.replaceAll("\\.+", "");
		String s3 = s2.replaceAll("(.)\\1+", "$1");	//$1代表第一组中的内容
		System.out.println(s3);
        //我要学编程

七、Pattern和Matcher

1.概述

Pattern类:

正则表达式的编译表示形式。

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

Matcher类:

通过解释 Pattern字符序列执行匹配操作的引擎。

通过调用模式的 matcher 方法从模式创建匹配器。创建匹配器后,可以使用它执行三种不同的匹配操作:

  • matches 方法尝试将整个输入序列与该模式匹配。

  • lookingAt 尝试将输入序列从头开始与该模式匹配。

  • find 方法扫描输入序列以查找与该模式匹配的下一个子序列。

每个方法都返回一个表示成功或失败的布尔值。通过查询匹配器的状态可以获取关于成功匹配的更多信息。

2.调用顺序

典型的调用顺序:

Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();

仅使用一次正则表达式:

boolean b = Pattern.matches("a*b", "aaaaab");

3.方法

 booleanmatches()
          尝试将整个区域与模式匹配。
 booleanlookingAt()
          尝试将从区域开头开始的输入序列与该模式匹配。
 booleanfind()
          尝试查找与该模式匹配的输入序列的下一个子序列。
 booleanfind(int start)
          重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。
 Stringgroup()
          返回由以前匹配操作所匹配的输入子序列。
 Stringgroup(int group)
          返回在以前匹配操作期间由给定组捕获的输入子序列。

4.案例

案例1:

Pattern p = Pattern.compile("a*b");					//获取到正则表达式
Matcher m = p.matcher("aaaaab");					//获取匹配器
boolean b = m.matches();						//看是否能匹配,匹配就返回true
		
System.out.println(b);            //true
		
System.out.println("aaaaab".matches("a*b"));  		    //与上面的结果一样

案例2:

//需求:把一个字符串中的手机号码获取出来
String s = "我的手机是18511866260,我曾用过18987654321,还用过18812345678";
String regex = "1[3578]\\d{9}";

Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(s);
while(m.find())
	System.out.println(m.group());
/*
*18511866260
*18987654321
*18812345678
/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值