黑马程序员-->09_正则表达式

来源:互联网 发布:乱舞春秋 知乎 编辑:程序博客网 时间:2024/06/05 16:06

-------android培训java培训、期待与您交流! ----------

一、什么是“正则表达式”
简单点说就是“符合一定规则的表达式”,是专门儿操作字符串的一个方法,是java.lang.String类中的方法。比方说我给自己定义的字符串规定“字符串必须是1-9里面的数字,只要不符合就不可以!”,所以定义一个String类型的规则,这个规则也就是正则表达式,用英文regex表示,然后需要自己操作的字符串使用String类中的方法matches和自己事先定义好的正则表达式进行比较String s.matches(regex);,如果符合的话,将会返回的是true,否则false。所以自己可以使用判断的方法进行比较,使用“正则表达式”是相当的高效率的一种解决String字符串的方法。

二、正则表达式常用规则

1、字符规则:
x就是一个字符,这个字符并不是x啊,是任意的一个未知字符
\\反斜杠字符,只要自己需要反斜杠的时候,一定要使用双反斜杠
\t水平制表符
\n换行符
\r回车符
\f换页符
\e转义符

2、字符类规则:
[abc]第一个字符是a、b、或者c(简单类)
[^abc]第一个字符是除了abc的任意的一个字符
[a-zA-Z]第一个字符是a到z或者是A到Z,两头的字母都是包括的
[a-d[m-p]]第一个字符是a到d或者是m到p,是这两个范围的并集
[a-z&&[def]]第一个字符是d、e、或者f,属于交集
[a-z&&[^bc]]第一个字符是除了bc的所有小写字母
[a-z&&[^m-p]]第一个字符是a到z但是不是m到p的字母

3、预定义字符类
.   这个符号意思是能是任意的字符(与行结束可能匹配也可能不匹配)
\d数字,任意的数字,[0-9]
\D非数字,只要不是数字就可以[^0-9]
\s空白字符,[\t\n\x0B\f\r]
\S非空白自负,[^\s]
\w单词字符,[a-zA-Z_0-9]
\W非单词字符[^\w]

4、Greedy数量词(贪婪的)
X?第一个字符,一次或者一次也没有
X* 第一个字符,零次或者多次
X+第一个字符,一次或者多次
X{n}第一个字符,恰好n次
X{n,}第一个字符,至少n次
X{n,m}第一个字符,至少n次,但是不能超过m次

5、Reluctant数量词(不情愿的,勉强的)
X??第一个字符,一次或一次也没有
X*?第一个字符,零次或者多次
X+?第一个字符,一次或者多次
X{n}?第一个字符,恰好n次
X{n,}?第一个字符,至少n次
X{n,m}?第一个字符,至少n次,但是不超过m次

6、Possessive(占有欲)数量词
X?+第一个字符,一次或者一次也没有
X*+第一个字符,零次或者多次
X++第一个字符,一次或者多次
X{n}+第一个字符,恰好n次
X{n,}+第一个字符,至少n次
X{n,m}+第一个字符,至少n次,但是不超过m次

7、Logical(逻辑上的)运算符
XY X后面跟上Y
X|Y X或者是Y
(X) X,作为捕获组

三、“叠词”的去除
怎样去除“叠词”?下面是一个例子:
要求:将字符串“我我........我我......我要..........要要........学学学...........学学学................编编编编编编编编编..........程程程程程程程程........”替换成“我要学编程”。
Str = str.replaceAll("\\.+","");  //意思是将前面的所有......都换成空,结果将是“我要学编程”。
str = str.replaceAll("(.)\\1+","$1"); //这里的(.)是引用的前面的“.”结果将是“我要学编程”。

 

四、正则表达式的基本功能
1、匹配(小程式如下:)
要求:手机号码只能在13*********、15*********、18***********之中。

public static void check(){ String number="15893831710"; String regex="1[358]\\d{9}";  //意思就是第一个数字必须是1,第二个是3、5或者8,后面全是数字,正好9个。 boolean b=number.matches(regex); System.out.println(b);}

2、切割(小程式如下:)
要求:将一个路径中的所有文件夹切割出来。

public static void split(){ String str=""c:\\abc\\nihao\\ninindfjds\\fdjkfjs","\\\\""; //意思就是只要遇到"\\",就会进行切割 String regex="\\\\"; String[] arr=str.split(regex); for(String s:arr){  System.out.println(s); } String str1="djkfsaajfdksjjdfdasfccdfjas";  //意思就是遇到叠词,就会进行切割 String regex1="(.)\\1+";   //(.)\\1+意思就是两个或者两个以上都是相同的字母 String[] arr1=str1.split(regex1); for(String s1:arr1){  System.out.println(s1); }}

 

3、替换(小程式如下:)
要求:将字符串中的叠词替换成相同的单个字符,比方说将“zzzzz”换成“z”

public static void replace(){ String s="dfdshhhjfdlksajfluuuujfdkslafxxdk";  String regex="(.)\\1+"; String s1="$1"; String s2=s.replaceAll(regex,s1); System.out.println(s2);}

4、获取(小程式如下:)

public static void get(){ String str="ming tian jiu yao fang jia le , da jia."; String reg="\\b[a-z]{4}\\b";Pattern p=Pattern.compile(reg); Matcher m=p.matcher(str); while(m.find()){  System.out.println(m.group()); }}

五、正则表达式编程常用规则
1、上来不用说,先定义自己要操作的“字符串”和“正则规则”
 String str=“我是一个字符串”;
 String reg=“我是正则表达式”;
2、然后将正则规则封装成对象,使用的是(“pattern”样式的意思,“compile”编译的意思)
 Pattern p=Pattern.compile(reg);
 返回的是Pattern类型的数据
3、然后将“字符串“和”规则“进行关联
 Matcher m=p.matcher(字符串);
4、使用while循环进行遍历,里面使用的是Matcher类创建的对象m调用自身方法find()返回的是boolean类型。
 while(m.find()){
  System.out.println(m.group()); //调用group方法返回的是满足条件的String类型的结果
}

按照java api的原话:典型的调用顺序!
注意:String类中的matches就是封装的Pattern和Matcher!

0 0
原创粉丝点击