java存储正规文法_一篇文章搞懂JAVA正则表达式使用

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次

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值