Java正则表达式常用方式总结

1. 用法

主要是通过Pattern类,Matcher类和一个PatternSyntaxException异常类才进行操作,其中大部分操作都在Matcher类中。

1.1 校验字符串

String a = "abb123sa2wq";

String reg = "^([A-Z]|[a-z]|[0-9])*$"; //这是一个匹配字母和数字的正则表达式
Pattern pattern = Pattern.compile(reg); //Pattern说明了正则表达式的格式
Matcher matcher = pattern.matcher(a); //matcher用来匹配对应的字符串是否符合规则

System.out.println(matcher.matches()); // 如果符合规则,则是true,不符合就是false。

1.2 替换字符串

String a = "abb123sa2wq";

String reg = "^([A-Z]|[a-z]|[0-9])*$"; //这是一个匹配字母和数字的正则表达式
Pattern pattern = Pattern.compile(reg); //Pattern说明了正则表达式的格式
Matcher matcher = pattern.matcher(a); //matcher用来匹配对应的字符串是否符合规则

System.out.println(matcher.replaceAll("aaa")); // replaceAll会将匹配的内容直接替换成传入的参数。 此处输出为aaa

2. 语法

2.1 元字符

字符描述
^匹配字符串的开始
$匹配字符串的结束
\w匹配字母、数字、下划线。
\W匹配非字母、数字、下划线。
\b匹配一个数字字符,0-9
\B匹配一个非数字字符
.匹配除了\r和\n以外的任意字符

基本用法:

  1. 匹配一个数字。(在java当中,不能直接识别 ‘\’ 符号,所以要在前面再加一个转义符号 ‘\’ 来表明下一个符号是 ‘\’ 。简单来说就是Java中所有的 ‘\’ 都要写两遍)
    String reg = "^\\b";
    Pattern pattern = Pattern.compile(reg);
    
    String a = "1";
    System.out.println(pattern.matcher(a).matches()); // true
    
    String b = "12"
    System.out.println(pattern.matcher(b).matches()); // false
    
  2. 匹配一个手机号(11位)。
    String reg = "^\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d$";
    Pattern pattern = Pattern.compile(reg);
    
    String a = "18844445567";
    System.out.println(pattern.matcher(a).matches()); // true
    
  3. 匹配字符a。
    String reg = "^a";
    Pattern pattern = Pattern.compile(reg);
    
    String a = "a";
    System.out.println(pattern.matcher(a).matches()); // true
    String a = "b";
    System.out.println(pattern.matcher(a).matches()); // false
    

2.2 重复限定符

要是手机号这种限定位数的还好,如果是不限定位数的,只靠元字符就不够用了,所以有重复限定符。

字符描述
*重复0次及以上
+重复一次及以上
?重复0-1次
{n}重复n次
{n,}重复n次及以上
{n,m}重复n-m次
  1. 匹配一串数字,不限长度。
    String reg = "^\\d*$";
    Pattern pattern = Pattern.compile(reg);
    
    String a = "18844445567";
    System.out.println(pattern.matcher(a).matches()); // true
    String a = "123";
    System.out.println(pattern.matcher(a).matches()); // true
    
  2. 匹配一个以189开头的电话号码。
    String reg = "^189\d{8}$";
    Pattern pattern = Pattern.compile(reg);
    
    String a = "18944445555";
    System.out.println(pattern.matcher(a).matches()); //true
    
  3. 匹配一个a开头,多个b结尾的字符串
    String reg = "^ab*$";
    Pattern pattern = Pattern.compile(reg);
    
    String a = "a";
    System.out.println(pattern.matcher(a).matches()); // true
    String b = "abbb";
    System.out.println(pattern.matcher(b).matches()); // true
    

2.3 分组

通过括号(),可以将括号内部的单位当成一个整体。

  1. 匹配多个ab。
    String reg = "^(ab)*$";
    Pattern pattern = Pattern.compile(reg);
    
    String a = "";
    System.out.println(pattern.matcher(a).matches());
    String b = "ababab";
    System.out.println(pattern.matcher(b).matches());
    
  2. 匹配多个括号(由于括号有特殊意义,所以为了将其识别成普通括号,需要在前面加上 ‘\’ 转义,我们的 ‘\’ 符号也是如此,因为有特殊意义所以前面加上 ‘\’ 进行转义,所以是 ‘\\(’ )。
    String reg = "^(\\(\\))*$";
    Pattern pattern = Pattern.compile(reg);
    
    String a = "()";
    System.out.println(pattern.matcher(a).matches());
    

2.4 条件或

匹配一批移动手机号码,用 | 进行区分。

String reg = "^(134|135|136|137|138|139|147|150|151|152|157|158|159|182|187|188)\\d{8}$";
Pattern pattern = Pattern.compile(reg);

String a = "13455556666";
System.out.println(pattern.matcher(a).matches());

2.5 字符范围

当数字太多,条件或用起来太麻烦的时候,就需要用区间[]进行划分范围。

  • 数字0-9可以划分为[0-9]。
  • 大写字母可以划分为[A-Z]。
  • 小写字母可以划分为[a-z]。

于是刚刚的手机号可以重新写成这样

String reg1 = "^(13[4-9]|147|15[0-2]|15[7-9]|182|18[7-8])\\d{8}$";
String reg2 = "^1(3[4-9]|47|5[0-2]|5[7-9]|82|8[7-8])\\d{8}";
Pattern pattern = Pattern.compile(reg2);

String a = "13955556666";
System.out.println(pattern.matcher(a).matches());

2.6 非字符范围

在中括号的最前面加上 ^ 表示匹配不在范围内的所有字符。

匹配除了1-5开头的QQ号码。

String reg = "^([^1-5])\\d*$";
Pattern pattern = Pattern.compile(reg);

String a = "1894423";
System.out.println(pattern.matcher(a).matches()); // false;
String b = "6894423";
System.out.println(pattern.matcher(a).matches()); // true;

参考材料

正则表达式真的很骚,可惜你不会写!!! - 掘金
https://juejin.im/post/5b96a8e2e51d450e6a2de115Java
正则表达式 | 菜鸟教程
https://www.runoob.com/java/java-regular-expressions.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值