正则表达式
(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 = Pattern.compile(regex);
Matcher match = p.matcher(str);
while(match.find()){// 代表发现匹配的元素
String content = m.group();// 获取正则表达式匹配的内容
(4)案例:
@Test
public void test_replaceAll(){
String str = "123 abc444a111";
str = str.replaceAll("abc.*", "abc efg");
System.out.println(str);
}
@Test
public void test_replace(){
String str = "123 abc444a111abc";
str = str.replace("abc.*", "abc efg");// replace注意参数不是正则表达式
System.out.println(str);
}
@Test
public void test_split(){
//使用regex进行字符串切割称为模式匹配
String str = "abcd1aaaa3sss5";
System.out.println(Arrays.toString(str.split("\\d")));//例如以数字作为分隔符
}
@Test
public void test_split_2(){
String filePath = "E:\\a\\b.txt";
System.out.println(Arrays.toString(filePath.split("\\\\")));//java中\\ 表示\ 而正则中\\也表示\,所以\\\\解析为\\
}
/**
* 例如:校验是否是数字
*/
@Test
public 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("您输入的是数字可以进行数字业务操作");
}
/**
* 例如:校验是否是数字然后以逗号分隔
*/
@Test
public 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位数字的数字
*/
@Test
public void test3(){
String str = "15936270517abcd3333ff15936270516";
String regex = "\\d{11}";
System.out.println("\t");
Pattern pattern = Pattern.compile(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);
}
@Test
public 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);
}
@Test
public void test2(){
String str = "hello world,are you OK? world,world is OK world, world";
String regex="world";
int count=0;
Pattern pattern = Pattern.compile(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位数字)