java正则表达式
负责字符串匹配处理规则,应用广泛,可以应用于:Java grep vi 等
1.学习建议:
1.能够读懂正则表达式
2.能够写出简单的正则表达式
3.不要过多的分配学习时间
2字符集
[1234]表示1,2,3,4之一
[^12]除了1,2
[1-5]表示1,2,3,4,5
[a-f]表示a-f之间的
[0-9a-fA-F]表示一个十六进制符0[xX]
[0-9a-fA-F]{1,8}表示整数的十六进制数表达式
[\w-]表示5-15个人以字符下划线、数字及"-"
3预定义字符集
1.\d表示[0-9]
2."."表示任意字符
3.\w表示单词字符[0-9a-fA-F]包含下划线
4.\s表示匹配空白
5.\D表示非数字
6.\S表示非空白
7.\W表示非单词字符
8.{m,n}表示数词m到n个
9.{n}表示数词n个.
10.?表示出现0到1次
11.+表示能出现1到n次
12、*表示能出现0-n次
4.正则表达式以^开头,以$结尾
5.常用的正则表达式写法
邮编编码
^[0-9][0-9][0-9][0-9][0-9][0-9]$
^[0-9]{6}$
^\d{6}$
用户名规则
^\w{8,10}$ //可出现8-10个字符
电话号码
+186 13912345678
^(\+86|0086)?\s?\d{11}$ //+需要转义+86或0086出现0到1次
身份证号码
^\d{15}(\d{2}[0-9xX])?$
一个点的坐标
^\d+(,\s|\s+)\d+$ // /d+ 表示出现一个及以上的数字 (,\s*|\s+)表示出现逗号和零个及以上的空白或一个以上的空白
日期
2011-01-30
^\d{4}-\d{2}-\d{2}$
ip
地址192.168.0.2
^\d{1,3}\.\d{1,3}\.\d{1,3}$
^\d{}
6.String 对正则表达式的支持
1. .matches() 匹配正则表达式。
2. .split("[,\s\|]")切分字符串为字符串数组
public class SpiltDemo { public static void main(String[] args) { //根据逗号切割 for(String token :"Justin,Monica,Irene".split(",")){ System.out.println(token); } //根据Orz切割 for (String string : "JustinOrzMonicaOrzIrene".split("Orz")) { System.out.println(string); } //根据tab切割 for (String string1 : "Justin\tMonica\tIrene".split("\\t")) { System.out.println(string1); } }
3. .replaceAll().//符合规则的表示式的字符串取代后返回新的字符串
贪婪量词 说明
X? X项目出现一次或没有
X* X项目出现0-n次
X+ X项目出现1-n次
X{n} X项目出现n次
X{n,} X项目出现至少出现n次
X{m,n} X项目出现m-n次
贪婪量词:如上(比较器Matcher会把整个文字吃掉再逐步吐出文字看是否有符合贪婪变量的规则表达式,贪婪词会找出长度最长的符合文字)
逐步量词:贪婪量词表示法后面加上?(一边吃掉文字一边看吃下的是否符合规则表达式逐步量词找出的是长度最短的符合文字)
独步量词:贪婪量词表示法后面加上+(比较器会吃掉整个文字然后看独吐量词是否符合吃下的文字如果符合就不会吐出来了。)
String[] regexs={".*foo",".*?foo",".*+foo"}; for (String regex : regexs) { System.out.println("xfooxxxxxfoo".replaceAll(regex," wbm")); }
结果为:
wbm
wbm wbm
xfooxxxxxfoo
边界比较
for (String regex : regexs) { System.out.println("xfooxxxxxfoo".replaceAll(regex," wbm")); } for (String string : "Justin dog MOnica doggie".split("dog")) { System.out.println(string.trim()); } for (String string : "Justin dog MOnica doggie".split("\\bdog\\b")) { System.out.println(string.trim()); }
Pattern与Matcher
java.util.regex.Pattern实例是规则表达式做剖析、验证等工作,确定表达式语法无误,对字符串进行比较。
Pattern的构造函数被标记为private所以无法使用new来创建Pattern实例,而必须通过静态方法compile()来取得,compile在剖析规则表达式无误以后将会
返回Pattern实例。
Pattern pattern=Pattern.complie(".*foo");
取得Pattern实例之后可以使用split()来切割;可以使用matcher()方法制定比较的字符串这会返回Java.util.regex.Matcher实例,表示对指定字符串的比较器
,可以使用find()方法查看是否有下一个字符串 group()返回符合的字符串。
String[] regexs={".*foo",".*?foo",".*+foo"};
for (String regex : regexs) {
Pattern pattern=Pattern.compile(regex);
Matcher matcher=pattern.matcher("xfooxxxxxfoo");
System.out.printf("%s find", pattern.pattern());
while(matcher.find()){
System.out.printf("\"%s\"",matcher.group());
}
System.out.println("in \" xfooxxxxxfoo\".");
}
结果:
.*foo find"xfooxxxxxfoo"in " xfooxxxxxfoo".
.*?foo find"xfoo""xxxxxfoo"in " xfooxxxxxfoo".
.*+foo findin " xfooxxxxxfoo".
---恢复内容结束---