黑马程序员-正则表达式

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ---------------------

注意:1、在不表示转义构造的任何字母前使用反斜杠都是错误的

      2、主要用来操作字符串数据

需求:判断qq号的正确性(1、必须是数字。2、必须由515为组成3、第一位不能为0)

String regex=[1-9][0-9]{4,14};

 

新思路:判断一个字符串中是否全是数字,出了用正则表达式之外,还可以这么用:

  Long long=Long.parseLong(str).

如果抛出异常,则str中并非全是数字

 

下文绿色字体引用自:http://blog.youkuaiyun.com/lovingprince/article/details/8813501

我们平时经常使用的正则表达式默认情况下基本都是Greedy模式,也就是贪吃模式,java中看下表

Greedy 数量词

X?

X,一次或一次也没有

X*

X,零次或多次

X+

X,一次或多次

X{n}

X,恰好 n 次

X{n,}

X,至少 n 次

X{n,m}

X,至少 n 次,但是不超过 m 次

也就是说对于 abcd123这个原始文本来说 .*3 是可以匹配的,因为点可以匹配任何字符,*表示可以匹配0次或者多次,全部吃入abcd123发现.*匹配了,但是后面有个3却无法匹配,因此就回溯一个字符,也就是.*只匹配abcd12 刚好整个表达式可以匹配。这就是贪吃,可以回溯。

Greedy相类似的还有一个Possessive 

Possessive 数量词

X?+

X,一次或一次也没有

X*+

X,零次或多次

X++

X,一次或多次

X{n}+

X,恰好 n 次

X{n,}+

X,至少 n 次

X{n,m}+

X,至少 n 次,但是不超过 m 次

它和greedy类似,也是全部吃入,但是唯一不同的是它不回溯,所以对于上面的abcd123这个例子,.*+3是不匹配的。

 

对于Reluctant 来说,就是Greedy的一个相反的匹配模式,他从左到有一个一个开始匹配,而不是整个字符串一个一个回溯。

Reluctant 数量词

X??

X,一次或一次也没有

X*?

X,零次或多次

X+?

X,一次或多次

X{n}?

X,恰好 n 次

X{n,}?

X,至少 n 次

X{n,m}?

X,至少 n 次,但是不超过 m 次

同样对于上面这个例子,abcd123,  .*?3 也是匹配的,因为从左到右,一个一个看只有全部才能匹配,而对于 模式.+?来说,只匹配最左边的a字符,如果.*?意味着没有匹配任何字符。

正则表达式对字符串的常见操作:

1、匹配(Stringmatches方法)

2、切割(Stringsplit方法)

package com.itheima;

public class Test9 {

	/**
	 * 写一个正则表达式,可以匹配尾号5连的手机号。规则:
	 * 第1位是1,第二位可以是数字3458其中之一,后面4位任意数字,最后5位为任意相同的数字。例如:18601088888、13912366666
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 1表示开始第一位数字是1
		// [3458]表示第二位数字是3或4或5或8
		// \\d{4} \d表示0到9之间的数字,需要转义,所以变为\\d,{4}表示重复4次
		// ()表示一组,(\\d)表示从0到9之间选一个数,组成一组,\\1表示将该组标示为 1,{4}表示后面的4个数都必须与该组中的数据一样
		String regex = "1[3458]\\d{4}(\\d)\\1{4}";
		String str = "13912366666";
		System.out.println(str.matches(regex));

	}

}

3、替换(String中的replaceAll方法)

需求:把重复的字符变成单个字符

String str="zhangxiaoxiangtttlihuomingaaaaaaabixiangdong";

str=str.replaceAll("(.)\\1+","$1");

System.out.println(str);

如果把重复的字符去掉,直接这样就可以了

str=str.replaceAll("(.)\\1+","");

4、获取

原理://将正则表达式进行对象的封装

Pattern p=Pattern.compile(a*b);

//通过正则对象的matcher方法与字符串相关联,获取要对字符串操作的匹配器对象Matter

Matcher m=p.matcher(aaaab);

//通过Matcher匹配器对象的方法对字符串进行操作

Boolean b=m.matches();

实例:

获取三个字母组成的单词

 

练习1:治疗口吃

String str="我要.....好...好.....学习...天....天向上";

String regex="(\\.)\\1+";

str=str.replaceAll(regex, "");

System.out.println(str);

练习2

 

练习3

 

练习4

 

 



---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ---------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值