正则表达式
(1)正则表达式概念:
正则表达式(regular expression)描述了一种字符串 -regex
匹配的模式,可以用来:校验
(a)检查一个串中是否含有符合某个规则的子串,并且可以得到这个子串;(b)根据匹配规则对字符串进行灵活的替换操作。
(2)常见表达式:
[a] :匹配a这个字符 当一个字符时[]可以省略[abc] :匹配a,b,c中的任意字符 abc[0-9] :匹配0-9中的一个数字 [a-z] :匹配26个英文小写字母 [A-Z] :匹配26个英文大写字母[a-zA-Z]:匹配26个英文字母[a-zA-Z0-9]:英数(英文 数字)[a-zA-Z0-9_] : 匹配单词字母(匹配字母,数字,下划线)\d :匹配0-9中的一个数字\w : 匹配单词字母(匹配字母,数字,下划线)\D : 匹配非数字字母\W : 匹配非单词字母\s : 匹配空白字符(空格,换行,tab制表符). 匹配任意字符?:最多出现一次+:至少出现一次 *:可出现任意次数 |左右两边表达式之间 "或" 关系。{n} :代表出现n次 {n,}:代表出现至少N次 a{3,} {n, m}:代表最少出现n次,最多出现m次^ :①如果出现在正则表达式的第一个字符上,代表以...开头, ②、否则代表非$ : 代表以...结尾
() 是为了提取匹配的字符串。表达式中有几个()就有几个相应的匹配字符串。
[]是定义匹配的字符范围。比如 [a-zA-Z0-9] 表示相应位置的字符要匹配英文字符和数字
{}一般用来表示匹配的长度,比如 \s{3} 表示匹配三个空格,\s[1,3]表示匹配一到三个空格。
(3)应用:
a.String中方法
1.replaceAll(String regex)
2.split(String regex)
3.matches(String regex) 告知此字符串是否匹配给定的正则表达式。 (String reg) 返回布尔类型
b.专门用作正则表达式的API类
Pattern pattern = pile(regex);
Matcher match = p.matcher(str);
while(match.find()){// 代表发现匹配的元素
String content = m.group();// 获取正则表达式匹配的内容
(4)案例:
@Testpublic void test_replaceAll(){String str = "123 abc444a111";str = str.replaceAll("abc.*", "abc efg");System.out.println(str);}@Testpublic void test_replace(){String str = "123 abc444a111abc";str = str.replace("abc.*", "abc efg");// replace注意参数不是正则表达式System.out.println(str);}@Testpublic void test_split(){//使用regex进行字符串切割称为模式匹配String str = "abcd1aaaa3sss5";System.out.println(Arrays.toString(str.split("\\d")));//例如以数字作为分隔符}@Testpublic void test_split_2(){String filePath = "E:\\a\\b.txt";System.out.println(Arrays.toString(filePath.split("\\\\")));//java中\\ 表示\ 而正则中\\也表示\,所以\\\\解析为\\}/*** 例如:校验是否是数字*/@Testpublic void test_match1(){Scanner sc = new Scanner(System.in);System.out.println("请输入一个数字:");String inputStr = sc.nextLine();if(!inputStr.matches("\\d*")){// 判断单个字符是否是数字用\d 多个字符可以考虑任意次数*System.out.println("您输入的不是数字。");return;}int num = Integer.parseInt(inputStr);System.out.println("您输入的是数字可以进行数字业务操作");}/*** 例如:校验是否是数字然后以逗号分隔*/@Testpublic void test_match2(){Scanner sc = new Scanner(System.in);System.out.println("请输入一组数字逗号分隔:");String inputStr = sc.nextLine();if(!inputStr.matches("\\d+(,\\d+)*")){// 判断单个字符是否是数字用\d 多个字符可以考虑任意次数\d*System.out.println("您输入的格式不对或包含非数字,请输入一组数字按照逗号分隔。");return;}System.out.println(Arrays.toString(inputStr.split(",")));}@Test/*** 手机号码验证"^1[3|4|5|7|8][0-9]{9}$“* */public void test2(){String telNum = "15936270517";String regex = "^1[3|4|5|7|8][0-9]{9}$";if(!telNum.matches(regex)){System.out.println("非手机号");}else {System.out.println("手机号正常");}}/*** 匹配如下满足连续11位数字的数字*/@Testpublic void test3(){String str = "15936270517abcd3333ff15936270516";String regex = "\\d{11}";System.out.println("\t");Pattern pattern = pile(regex);Matcher matcher = pattern.matcher(str);while(matcher.find()){//匹配,是否找到String num = matcher.group();// 获取匹配的子字符串System.out.println(num);}}@Test/*** html文本内容*/public void test4(){String html = "<p>你好</p>中国</br>";String regex = "<[^>]+>";html = html.replaceAll(regex, "");System.out.println(html);}
@Testpublic void test1(){String str = "hello world,are you OK? world,world is OK world, world";String subStr = "world";int count=0;int index =0;while((index=str.indexOf(subStr))!=-1){count++;str =str.substring(index+subStr.length()-1);}System.out.println(count);}@Testpublic void test2(){String str = "hello world,are you OK? world,world is OK world, world";String regex="world";int count=0;Pattern pattern = pile(regex);Matcher matcher = pattern.matcher(str);while(matcher.find()){count++;}System.out.println(count);}
(5)特殊需求
例如:
Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*.\w+([-.]\w+)*$域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+.?手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)