您的位置:首页 > 职场人生

黑马程序员_java正则表达式

2015-07-21 13:33 561 查看
正则表达式:符合一定规则的表达式。

作用:专门操作字符串。

特点:用一些特定的符号来表示一些代码操作,这样就简化书写。

学习正则表达式,就是在学习一些特殊符号的使用。

好处:可以简化对字符串的复杂操作。

弊端:符号定义越多,正则越长,阅读性极差。

具体操作功能:

1.匹配:String matches()方法

Greedy 数量词

X?

X,一次或一次也没有

X*

X,零次或多次

X+

X,一次或多次

X{n}

X,恰好 n 次

X{n,}

X,至少 n 次

X{n,m}

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

字符类

[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]

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

1    

((A)(B(C)))

2    

\A

3    

(B(C))

4    

(C)

 

2.切割:String split()

按照多个空格来切

“ +”即空格加上“+”表示一次或多次

按照点来切

“\\.”必须加上两个转义字符

按照\\来切

“\\\\”必须是四个

按照叠词来切割

“(.)\\1”

为了可以让规则的结果被重用,可以将规则封装成一个组。

用( )完成,组的出现都有编号。

从1开始,想要使用已有的组可以用\n(n就是组的编号)的形式来获取。

判断表达式有多少个组可以用左括号来判断,一个左括号代表一个组,

从左往右数,左边第一个左括号,即为第一个组,

以此类推。

3.替换:String replaceAll()

把5个以上的数字装换成#

String s = s.replaceAll(“\\d{5,}”,”#“)

把叠词替换成&

String s = s.replaceAll(“(.)\\1+”,”&”)

把重叠的字符替换成单个字字符如:zzzz===>z

String s = s.replaceAll(“(.)\\1+”,”$1”)用$获取组的字符,1代表第一个组。

4.获取:

把规则封装成对象:Pattern p = Pattern.compile(regex);

让正则对象和要作用的字符串相关联,获取匹配器对象

Matcher m = p.matcher(str);

Syso(m.matcher);得到boolean型的值

其实Sting类中的matcher方法,用的就是Pattern和Matcher的对象来完成,只不过被String的方法封装后,用起来较为简单,但是功能单一。

While(m.find())

{

Syso(m.group());

}

find():查找与模式相匹配的子串

group():返回所匹配的子串

如果m.matcher先匹配,再使用m.find();

会从m.matcher匹配后的子串查找,

如:有10个字符,matcher读到了第三个字符,返回false后,

find()会从第四个字符开始查找。

边界匹配器

^

行的开头

$

行的结尾

\b

单词边界

\B

非单词边界

\A

输入的开头

\G

上一个匹配的结尾

\Z

输入的结尾,仅用于最后的结束符(如果有的话)

\z

输入的结尾

 

 

四种功能到底使用哪一个?或者哪几个?

思路方式:

1.如果只是想知道该字符是否对或错,使用匹配。

2.想要将已有的字符串变成另一个字符串,使用替换。

3.想要按照自定的方式把字符串变成多个字符串。使用切割,获取规则以外的子串。

4.想要拿到符合需求的字符串子串,使用获取。获取符合规则的字符串。

 

示例:

写一个正则表达式,可以匹配尾号5连的手机号。

  规则: 第1位是1,第二位可以是数字3458其中之一,后面4位任意数字,最后5位为任意相同的数字。

  例如:18601088888、13912366666

代码:

package com.itheima;

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test6 {

public static void main(String[] args) {
//思路:后五位为任意相同数字则需要用到组
//输入提示
System.out.println("请输入手机号:");
//键盘录入一个手机号
Scanner in = new Scanner(System.in);
//用字符串接收
String str = in.nextLine();
//写正则表达式
String regx="1[3458]\\d{4}(\\d)\\1{4}";
//把规则封装成对象
Pattern p = Pattern.compile(regx);
//判断字符串是否符合规则
Matcher m = p.matcher(str);
//输出判断结果
System.out.println("结果为:"+m.matches());
}

}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: