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

相关推荐
仍然探索未知中1 分钟前
MySQL数据库介绍以及安装(本地windows、Ubuntu 20.04)
数据库·mysql
晴空月明10 分钟前
Java 集合框架底层数据结构实现深度解析
java
louisgeek11 分钟前
Java Creational 创建型模式之 Builder 建造者模式
java
挑战者66688817 分钟前
springboot入门之路(一)
java·spring boot·后端
noravinsc1 小时前
django filter 筛选 取出全部用户id
数据库·mysql
不恋水的雨1 小时前
解决sql查询中in查询项过多时很慢的问题
数据库·sql·mysql
重整旗鼓~1 小时前
7.索引库操作
java·开发语言
云心雨禅2 小时前
Spring Boot热更新技巧:节省90%重启时间
java·数据库·spring boot
岁忧2 小时前
(LeetCode 每日一题) 2966. 划分数组并满足最大差限制 (贪心、排序)
java·c++·算法·leetcode·职场和发展·go
Maỿbe2 小时前
实现回显服务器(基于UDP)
java·javaweb·echo·回显服务器