1.java正则表达式的常见写法?
//比如校验手机号
第一种:
String str = "18030577878";
Pattern p = Pattern.compile("^1[0-9]{10}$");
Matcher matcher = p.matcher(str);
System.out.println(matcher.matches()); //返回true
第二种:
String str = "18030577878";
System.out.println(str.matches("^1[0-9]{10}$")); //返回true
//找出字符串中的手机号
String str = "18030577878,,,18030888989";
Pattern p = Pattern.compile("1[0-9]{10}");
Matcher matcher = p.matcher(str);
while (matcher.find()) {
System.out.println(matcher.group()); //输出 18030577878 18030888989
}
2.正则表达式中有"^" "$"和没有的区别
^ 表示以什么开始 $ 表示以什么结束
//在校验手机号是
String str = "18030577878";
Pattern p = Pattern.compile("^1[0-9]{10}$"); //Pattern p = Pattern.compile("1[0-9]{10}"); 在做校验手机号时并没有什么区别
Matcher matcher = p.matcher(str);
System.out.println(matcher.matches()); //返回true
//在查找字符串中的手机号时 如果加上^ $则匹配字符串的开头和结尾,则无法查找出字符串中的手机号
String str = "18030577878,,,18030888989";
Pattern p = Pattern.compile("1[0-9]{10}");
Matcher matcher = p.matcher(str);
while (matcher.find()) {
System.out.println(matcher.group()); //输出 18030577878 18030888989
}
3.match.group() 和match.group(int a);的区别
String str = "18030577878";
Pattern p = Pattern.compile("(1)([0-9]{10})"); //正常情况是这样写的Pattern p = Pattern.compile("1[0-9]{10}"); 这里为了分组加上了括号
Matcher matcher = p.matcher(str);
while (matcher.find()) {
System.out.println(matcher.group(0));
}
上面程序输出为:18030577878,如果把matcher.group(0)改为matcher.group(1)则输出 1,缓存matcher.group(2)则输出8030577878;
这里就可以知道group()和group(0)都表示匹配整个正则表达式,group(1)表示匹配第一个括号里面的内容,group(2)表示匹配第二个括号里面的内容
4.贪婪模式与非贪婪模式
贪婪模式:
// 要验证的字符串
String str = "javaweq0000,,java11ea";
// 编译正则表达式
Pattern pattern = Pattern.compile("j.*e");
// 开始匹配
Matcher matcher = pattern.matcher(str);
// 查找字符串中是否有匹配正则表达式的字符/字符串
while (matcher.find()) {
System.out.println(matcher.group()); //输出javaweq0000,,java11e
}
非贪婪模式:
// 要验证的字符串
String str = "javaweq0000,,java11ea";
// 编译正则表达式
Pattern pattern = Pattern.compile("j.*?e");
// 开始匹配
Matcher matcher = pattern.matcher(str);
// 查找字符串中是否有匹配正则表达式的字符/字符串
while (matcher.find()) {
System.out.println(matcher.group());//输出javawe java11e
}
ps:当"?"字符紧跟在任何一个其他限制符(*, +, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串。
5.单行匹配与多行匹配
// 要验证的字符串
String str = "javaweq0000, \n ,java11ea";
// 编译正则表达式
//Pattern pattern = Pattern.compile("j.*a"); //返回false
//Pattern pattern = Pattern.compile("j.*a", Pattern.DOTALL); //返回true
Pattern pattern = Pattern.compile("(?s)j.*a"); //返回true
// 开始匹配
Matcher matcher = pattern.matcher(str);
System.out.println(matcher.matches());
String str = "---123\n456---";
// 单行匹配 - 不会被替换
System.out.println(str.replaceAll("---.*---", "SUCCESS"));
输出:---123
456---
// 多行匹配 - 匹配并替换
System.out.println(str.replaceAll("(?s)---.*---", "SUCCESS"));
输出:SUCCESS
// 多行匹配 - 另一种方式
Pattern pattern = Pattern.compile("---.*---", Pattern.DOTALL);
System.out.println(pattern.matcher(str).replaceAll("SUCCESS"));
输出:SUCCESS
6.断言正则
① (?=表达式)表示匹配该表达式前面的内容,从右边开始找
.*(?=ing) 可以匹配 “cooking singing” 中的 “cooking sing” 而不是 cook
②(?<=表达式)表示匹配表达式后面的内容,从左边开始找
(?<=abc).* 可以匹配 abcdefg 中的 defg
③(?!exp)表示①的取非(非是与或非的那个非的意思),就是后面跟的不是exp就匹配成功
④(?
7.常用语法api
* 表示匹配前面的子表达式任意次。
+ 表示匹配前面的子表达式一次或多次。等价于{1,}
? 表示匹配前面的子表达式0次或1次。等价于{0,1}
{n} 表示匹配确定的n次。
{n,} 表示匹配至少n次。
{n,m}表示最少匹配n次,最多匹配m次