---------------------- <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、必须由5到15为组成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、匹配(String的matches方法)
2、切割(String的split方法)
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>、期待与您交流! ---------------------