Java正则表达式总结
引言
正则表达式(英文:regular expression)是用于描述字符串规则的工具,是记录文本规则的代码。
它可以用来搜索、编辑、处理文本。现有编程语言都支持正则表达式的处理,但每种语言都有细微的差别。
在Java 中,正则表达式的转义反斜杠要用:\\ 来表示,这是因为在《Java Language Specification》中明确规定,Java 中的一个反斜杠会用于转义Unicode编码。如果要匹配字符串中的反斜杠,那么需要四个反斜杠:\\\\ 。
在线正则表达式传送门:在线正则传送门
一、Java语言对正则的支持
最常用的正则表达式的类有Pattern和 Matcher,他们都是java.util.regex 包下的工具类。
Pattern 描述了一个正则表达式经过编译之后的对象,换句话说它就代表一个正则表达式对象。因为正则表达式本身也是由字符串来定义,但仅仅是字符串的正则表达式不可能直接去进行匹配工作,必须交由编程语言进行解析和实例化,变成某种数据结构才能够真正发挥作用。这一点和 html 必须先转化为一个 dom 树结构才能够进一步被处理有些类似。
Pattern 除了可以描述一个正则表达式之外,同时具备匹配的功能,可以使用静态的方法:
boolean isDecimal = Pattern.matches("^\\d+\\.\\d+", "20");
System.out.println(isDecimal); // 输出:falseboolean isDecimal = Pattern.matches("^\\d+\\.\\d+", "20.224");
System.out.println(isDecimal); // 输出:true
Matcher 是正则表达式匹配处理引擎。可以通过解释一个Pattern 对象对一个字符序列进行匹配操作,比如,编辑替换等等。
Matcher 对象的创建是通过调用 Pattern 对象的 matcher 方法:
Matcher m = reg.matcher("待处理的文本");
Matcher 对象一旦被创建,就可以处理三种不同的匹配操作:
1、匹配校验:matches
它同样可以对整个输入字符串进行匹配校验(这与 Pattern.matches() 静态方法的功能完全相同):
Pattern reg = Pattern.compile("^\\d+\\.\\d+");
Matcher m = reg.matcher("2019.12.22");
boolean matches = m.matches();
System.out.println(matches); // 输出:false
2、头部查找:lookingAt
查找匹配返回一个布尔,当且仅当输入序列,在序列开始的位置满足正则才返回 true,但不要求整个字符序列都要满足 。
Pattern reg = Pattern.compile("^\\d+\\.\\d+");
Matcher m1 = reg.matcher("2019.12-1212");
boolean prefixMatched1 = m1.lookingAt();
System.out.println(prefixMatched1); // true
Matcher m2 = reg.matcher("2019-1212.12");
boolean prefixMatched2 = m2.lookingAt();
System.out.println(prefixMatched2); // false
3、向下查找:find
这个方法同样返回布尔,该方法尝试查找下一个与正则相匹配的子串,这在处理较长输入序列的时候比较有用,它会从输入序列的第一个字符开始匹配,或者如果在之前的程序中有调用过该方法,且匹配器没有被重置过,那么它就会从没有被之前的匹配操作匹配过的字符开始继续匹配。
Pattern reg = Pattern.compile("\\d+\\.\\d+");
Matcher m1 = reg.matcher("201912-12.12");
boolean lookingAt = m1.lookingAt();
boolean find = m1.find();
boolean find2 = m1.find();
System.out.println(lookingAt); // false
System.out.println(find); // true
System.out.println(find2); // false
二、正则表达式语法
注意,对于转义符,Java 中用 \\ 来表示正则表达式中的 \,因此抛开语言不谈,只针对正则表达式语法的话,只以 \ 来描述正则表达式语法。
正则表达式的规则非常多,仅靠人脑很难一次性全部记住,这里总结一些在工作中(非专业文本处理相关工作)常用的正则表达式的语法以及在线正则表达式的简单使用。
常用元字符
代码 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
常用限定符
代码/语法 | 说明 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
常用反义词
代码/语法 | 说明 |
---|---|
\W | 匹配任意不是字母,数字,下划线,汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |
这些正则描述符都是出现频率极高的存在,一般的文本匹配都离不开这些描述符,需要牢记。
附1:常用正则表达式(摘抄自菜鸟教程)
原地址:https://c.runoob.com/front-end/854
1、校验数字的表达式
- 数字:^[0-9]*$
- n位的数字:^\d{n}$
- 至少n位的数字:^\d{n,}$
- m-n位的数字:^\d{m,n}$
- 零和非零开头的数字:^(0|[1-9][0-9]*)$
- 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(\.[0-9]{1,2})?$
- 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})$
- 正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$
- 有两位小数的正实数:^[0-9]+(\.[0-9]{2})?$
- 有1~3位小数的正实数:^[0-9]+(\.[0-9]{1,3})?$
- 非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$
- 非零的负整数:^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$
- 非负整数:^\d+$ 或 ^[1-9]\d*|0$
- 非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
- 非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
- 非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
- 正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
- 负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
- 浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$
2、校验字符的表达式
- 汉字:^[\u4e00-\u9fa5]{0,}$
- 英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
- 长度为3-20的所有字符:^.{3,20}$
- 由26个英文字母组成的字符串:^[A-Za-z]+$
- 由26个大写英文字母组成的字符串:^[A-Z]+$
- 由26个小写英文字母组成的字符串:^[a-z]+$
- 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
- 由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$
- 中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$
- 中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
- 可以输入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+
- 禁止输入含有~的字符:[^~\x22]+
3、特殊需求表达式
- Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
- 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?
- InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
- 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
- 电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
- 国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
- 电话号码正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号): ((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)
- 身份证号(15位、18位数字),最后一位是校验位,可能为数字或字符X:(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)
- 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
- 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$
- 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在 8-10 之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,10}$
- 强密码(必须包含大小写字母和数字的组合,可以使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
- 日期格式:^\d{4}-\d{1,2}-\d{1,2}
- 一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$
- 一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$
- 钱的输入格式:
- 有四种钱的表示形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]*$
- 这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$
- 一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$
- 这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧。下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$
- 必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 "10" 和 "10.2" 是通过的:^[0-9]+(.[0-9]{2})?$
- 这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$
- 这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
- 1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$
- 备注:这就是最终结果了,别忘了"+"可以用"*"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里
- xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
- 中文字符的正则表达式:[\u4e00-\u9fa5]
- 双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
- 空白行的正则表达式:\n\s*\r (可以用来删除空白行)
- HTML标记的正则表达式:<(\S*?)[^>]*>.*?|<.*? /> ( 首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)
- 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)
- 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
- IP地址:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))
附2:在线正则表达式工具使用简介
一般的在线正则表达式都会有常用的匹配模式选择,一般选择模式之后,只要输入待匹配文本即可:
Java正则表达式总结相关推荐
- java正则表达式课程_通过此免费课程学习正则表达式
java正则表达式课程 by Beau Carnes 通过博卡恩斯 通过此免费课程学习正则表达式 (Learn Regular Expressions with this free course) & ...
- java正则表达式 1,Java正则表达式学习(1)
Java正则表达式学习(一) 1.什么是正则表达式: 正则表达式(regular expressions) 是一种描述字符串集的方法,它是以字符串集中各种字符串的公有特征为依据的. 正则表达式可以用于 ...
- 孪生素数 java代码_科学网—孪生素数猜想——利用 Java + 正则表达式 输出孪生素数对 - 马廷灿的博文...
查了一下资料,发现正则表达式竟然可以用来检查素数(http://coolshell.cn/articles/2704.html)!(由于工作需要,几年前开始接触.利用正则表达式,给工作带了很大方便,也 ...
- java正则表达式的用法_Java 正则表达式的使用
Java 正则表达式的使用 1:正则表达式语法大全 字符 说明 \ 将下一字符标记为特殊字符.文本.反向引用或八进制转义符.例如,"n"匹配字符"n".&quo ...
- Java正则表达式--Matcher.group函数的用法
https://www.cnblogs.com/jiafuwei/p/6080984.html Java正则表达式--Matcher.group函数的用法 原来,group是针对()来说的,group ...
- java 正则表达式入门(一)
Java正则表达式 定义:具有特定规则的一种表达式语言. 作用:专门用于操作字符串,操作意味着(校验,截取).且可以简化我们对字符串的操作方式 比如,验证手机号码 如果没有正则表达式我们的过程就应该是 ...
- bigint对应java什么类型_「JAVA」从格式化输出到扫描输入,深究Java正则表达式匹配之道
字符串是不可变的 字符串是不可变的,也就是说当字符串的内容发生改变的时候,会创建一个新的String对象:但是如果内容没有发生改变的时候,String类的方法会返回原字符串对象的引用. 而正则表达式往 ...
- Java 正则表达式使用详解
今天研究开源项目,哆啦A梦,研究里面显示log 的原理. 后来发现,用到了正则表达式.觉得很有用,就捡起来,重新研究一下. 学习思路指导: 每一门学问,最好的深入学习方法,是去其官网,研究其说明文档. ...
- java正则表达式 过滤特殊字符的正则表达式
在网上找了好久也没找到个合适的正则表达式以过滤特殊字符:自己学习了下,写了两个,实现要求. Java代码 // 过滤特殊字符 public static String StringFilter(Str ...
- JAVA正则表达式:Pattern类与Matcher类详解(转)
java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表 ...
最新文章
- 怎么导入mysql示例_MySQL命令行导出导入数据库实例详解
- js中报错“Maximum call stack size exceeded“解决方法
- Latent dirichlet allocation note
- MONTH_NAMES_GET
- gitlab 修改HTTP连接方式中的IP和端口
- 前端学习(1399):多人管理19项目拦截器
- python列表生成器语法_python列表生产式和生成器
- 社区儿童计算机活动总结,寒假社区服务活动总结
- 电子商务计算机网络的分类可分为,电子商务员基础知识:计算机网络的分类与拓扑结构...
- Redis哨兵主从配置(半自动)
- HttpClient 4.5.3 模拟登陆CSDN
- 佳能MG2580S清零
- 重复测量设计计算机结果分析,样本量估算4.7 | 重复测量设计方差分析样本量估算...
- hget和get redis_redis hget阻塞 使用redis时遇到的问题 - Redis - 服务器之家
- 如何在卫星地图上定位(经纬度定位)
- 美颜SDK多少钱一年?视频美颜SDK的价格由哪些因素影响?
- DSP篇--C6701功能调试系列之 FLASH测试
- Stanford-corenlp 英文词性标注
- 根据励磁电感、谐振电感(漏感)、功率等级、频率设计LLC变换器的变压器
- 环形缓冲区RingBuff的代码实现
热门文章
- scala中map添加值_如何在Scala Map中反转键和值
- 系统结构图 数据结构_数据结构图简介
- 开篇词:如何轻松获得 Offer
- 为什么劝你放弃Maven?看看Gradle的这些优点就知道了
- Auto activation triggers for Java(代码提示)功能扩展
- 【博主推荐】Python 基于Xlwings、Openpyxl自己重新封装Python操作Excel类
- 移动端实现文字轮播_移动端轮播图实现
- python 函数式编程 库_使用Python的toolz库开始函数式编程的方法
- java 不同包_Java项目中不同包的命名及作用
- 网页证书添加_二、Exchange2016部署及基础配置(NDS及证书配置)