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

相关推荐
爪哇学长6 分钟前
双指针算法详解:原理、应用场景及代码示例
java·数据结构·算法
ExiFengs10 分钟前
实际项目Java1.8流处理, Optional常见用法
java·开发语言·spring
paj12345678911 分钟前
JDK1.8新增特性
java·开发语言
繁依Fanyi22 分钟前
简易安卓句分器实现
java·服务器·开发语言·算法·eclipse
慧都小妮子33 分钟前
Spire.PDF for .NET【页面设置】演示:打开 PDF 时自动显示书签或缩略图
java·pdf·.net
m512737 分钟前
LinuxC语言
java·服务器·前端
IU宝42 分钟前
C/C++内存管理
java·c语言·c++
瓜牛_gn43 分钟前
依赖注入注解
java·后端·spring
hakesashou44 分钟前
Python中常用的函数介绍
java·网络·python
打鱼又晒网1 小时前
【MySQL】数据库精细化讲解:内置函数知识穿透与深度学习解析
数据库·mysql