Java 正则表达式

目录

[Java 正则表达式](#Java 正则表达式)

1、结构组成

元字符

量词

位置符号

分组

字符类

贪婪模式和非贪婪模式

零宽正向断言和负向断言

2、正则案例使用

Java正则表达式去除字符串中的中文

Java中的正则校验

分组/替换

排除字符


Java 正则表达式

1、结构组成

元字符

用于构建正则表达式的符号,常用的有

|---------|----------------------------------------------------------------------|
| 符号 | 描述 |
| . | 查找任意的单个字符,除换行符外 |
| \w | 任意一个字母或数字或下划线,A_Za_Z09,中任意一个 |
| \W | 查找非单词的字符,等价于[^A_Za_z0
9
|
| \d | 匹配一个数字字符,等价于[0-9] |
| \D | 匹配一个非数字字符,等价于[^0-9] |
| \s | 匹配任何空白字符,包括空格,制表符,换行符等等。等价于[\f\n\r\t\v] |
| \S | 匹配任何非空白字符,等价于[^\f\n\r\t\v] |
| \b | 匹配一个单词边界,也就是指单词和空格间的位置,比如'er\b'可以匹配"never"中的"er",但是不能匹配"verb"中的"er" |
| \B | 匹配非单词边界,'er\B'能匹配'verb'中的'er',但不能匹配'never'中的'er' |
| \0 | 匹配非单词边界,'er\查找NUL字符。 |
| \n | 匹配一个换行符 |
| \f | 匹配一个换页符 |
| \r | 匹配一个回车符 |
| \t | 匹配一个制表符 |
| \v | 匹配一个垂直制表符 |
| \xxx | 查找一个以八进制数xxx规定的字符 |
| \xdd | 查找以16进制数dd规定的字符 |
| \uxxxx | 查找以16进制数的xxxx规定的Unicode字符。 |
| \num | 这里的num指number,也就是数字,当\后面跟数字,表示匹配第几个括号中的结果 |

其实常用的几个可以简单记为下面的几个意思:

\s : 空格

\S : 非空格

\d : 数字

\D : 非数字

\w : 字符 ( 字母 ,数字,下划线_ )

\W : 非字符例子:是否有不是数字的字符

ab(c)d\1:等同于 abcdc 。

量词

用于限定子模式出现在正则表达式的次数。

符号 描述
+ 匹配一次或多次,相当于{1,}
* 匹配零次或多次 ,相当于{0,}
? 匹配零次或一次 ,相当于{0,1}
{n} 匹配n次
{n,m} 匹配至少n个,最多m个某某的字符串
{n,} 匹配至少n个某字符串

位置符号

符号 描述
$ 结束符号,例子:n$,匹配以n结尾的字符串
^ 起始符号,例如^n,匹配以n开头的字符串
?= 肯定正向环视,例:?=n,匹配其后紧接指定的n字符串
?! 否定正向环视,例如:?!n,匹配其后没有紧接指定的n字符串
?: 表示不匹配

注意点:

刚开始学习正则的时候,是比较容易混淆 ^ : 放在正则的最开始位置,就代表起始的意思,放在中括号里,表示排除的意思。也就是说,/[^a]/和/^[a]/是不一样的,前者是排除的意思,后者是代表首位

$:正则的最后位置,就代表结束的意思.

分组

符号 描述
| 选择(不是他就是她) | (竖线) 则表示或的关系,表示检测的字符串须满足其中一个时,才符合条件。
(...) 分组

字符类

符号 描述
[ ] [ ] 表示匹配其中任意一个字符。
[值1-值2] [值1-值2] 则表示值1到值2中间的所有字符都满足(包括值1和值2)。常用该正则来表示大小写字母范围,数字范围。
[0-9] 匹配 0 到 9 间的字符
[a-zA-Z] 匹配任意字母
[^ ] [^ ] 表示不与中括号里的任意字符匹配。
[^0-9] 不等于0到9的其它字符

()分组符号可以理解为,数学运算中的括号,用于计算的分组使用。[]可以理解为,只要满足括号里面其中的某种条件即可。比如[abc],意思是满足abc中的某一个,这样比较好记。

贪婪模式和非贪婪模式

其实可以简单的理解,贪婪模式就是尽可能多的匹配,非贪婪模式就是尽可能少的匹配.

贪婪模式量词: {x,y} , {x,} , ? , * , 和 +

非贪婪模式量词: {x,y}?,{x,}?,??,*?,和 +?,所以非贪婪模式就是在贪婪模式后面加了一个问号

零宽正向断言和负向断言

  • (?=)零宽正向断言: 括号内表示某个位置右边必须和=右边匹配上
  • (?!)负向断言: 括号内表示某个位置右边不和!后的字符匹配。
vbscript 复制代码
    只能输入数字:^[0-9]*$。
  只能输入n位的数字:^\d{n}$。
  只能输入至少n位的数字:^d{n,}$。
  只能输入m~n位的数字:^d{m,n}$
  只能输入零和非零开头的数字:^(0|[1-9][0-9]*)$
  只能输入有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
  只能输入有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
  只能输入非零的正整数:^+?[1-9][0-9]*$
  只能输入非零的负整数:^-[1-9][]0-9*$
  只能输入长度为3的字符:^.{3}$
  只能输入由26个英文字母组成的字符串:^[A-Za-z]+$
  只能输入由26个大写英文字母组成的字符串:^[A-Z]+$
  只能输入由26个小写英文字母组成的字符串:^[a-z]+$
  只能输入由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
  只能输入由数字、26个英文字母或者下划线组成的字符串:^w+$
  验证用户密码:^[a-zA-Z]w{5,17}$"正确格式为:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。
  验证是否含有^%&',;=?$""等字符:[^%&',;=?$"x22]+
  只能输入汉字:^["u4e00-"u9fa5]{0,}$
  验证Email地址:/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/
  验证InternetURL:^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$
  验证电话号码:^((d{3,4}-)|d{3.4}-)?d{7,8}$正确格式为:"XXX-XXXXXXX"、"XXXX- XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。
  验证身份证号(15位或18位数字):^d{15}|d{18}$
  验证一年的12个月:^(0?[1-9]|1[0-2])$正确格式为:"01"~"09"和"1"~"12"。
  验证一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$正确格式为;"01"~"09"和"1"~"31"。

2、正则案例使用

Java正则表达式去除字符串中的中文

java 复制代码
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class T1Main {
    public static void main(String[] args) {
        String str = "123abc呵呵fuc";
        String reg = "[\u4e00-\u9fa5]";
        Pattern pattern = Pattern.compile(reg);
        Matcher matcher=pattern.matcher(str);
        String newStr = matcher.replaceAll("");
        System.out.println("去除中文后的字符串:" + newStr);
    }
}

Java中的正则校验

正则表达式主要用途就是校验字符串,那么在Java中,只需要通过下面这个方法即可进行校验。

java 复制代码
boolean result = Pattern.matches(regex, input);
其中:
regex 是我们需要写的正则表达式校验规则;
input 是我们待校验的字符串;
返回的 result 就是我们校验的结果,当为 true 的时候,表示校验通过,当为 false 的时候,则表示校验不通过。

分组/替换

比如,想把yyyy-mm-dd格式,替换成mm/dd/yyyy怎么做?

java 复制代码
    public static void main(String[] args) {
        String regex = "(\\d{4})-(\\d{2})-(\\d{2})";
        String dateStr = "2017-06-12";
        System.out.println(dateStr.replaceAll(regex,"$2/$3/$1"));
    }

排除字符

字符串中想匹配不包括"TWN","HKG","MAC"的字符串

java 复制代码
    public static void main(String[] args) {
        String regex1 = "^(?!(HKG|MAC|TWN))[A-Z]{3}$";
        String input1 = "MAC";
        String input2 = "MAA";
        System.out.println(Pattern.matches(regex1,input1));//false
        System.out.println(Pattern.matches(regex1,input2));//true
    }

再小的努力,乘以365都很明显!
一个程序员最重要的能力是:写出高质量的代码!!
有道无术,术尚可求也,有术无道,止于术。
无论你是年轻还是年长,所有程序员都需要记住:时刻努力学习新技术,否则就会被时代抛弃!

相关推荐
酥骨鱼11 分钟前
Spring AI集成Qwen/QwQ-32B使用硅基流动实现对话
java·后端
鲁子狄15 分钟前
[笔记] 动态 SQL 查询技术解析:构建灵活高效的企业级数据访问层
java·spring boot·笔记·sql·mysql·mybatis
yaoxin52112333 分钟前
131. Java 泛型 - 目标类型与泛型推断
java
惊骇世俗王某人1 小时前
1. 深入理解ArrayList源码
java·开发语言
用户40315986396631 小时前
表达式并发计算
java·算法
SimonKing1 小时前
告别System.currentTimeMillis()!Java高精度计时最佳实践
java·后端·程序员
Dcs1 小时前
JUnit 5架构如何用模块化颠覆测试框架?
java
Dubhehug1 小时前
8.数据库索引
数据库·mysql·索引·索引分类·索引优缺点
肉肉不想干后端1 小时前
gRPC服务架构整合springboot部署实践指南
java
冬夜戏雪1 小时前
阿里云ubuntu安装mysql docker容器(拉,运行,测试完整版)
mysql·ubuntu·阿里云