Java SE 正则表达式
Java SE 正则表达式
目录
- Java SE 正则表达式
- 1、定义
- 1.1、 工具 RegexBuddy
- 2、字符集
- 2.1、 普通字符
- 2.2、 元字符与转义
- 3、字符类
- 3.1、 自定义
- 3.2、默认|标准字符类
- 3.3、量词
- 3.4、贪婪模式
- 4、边界
- 5、选择符与分组
- 5.1、选择符 |
- 5.2、分组 ( )
- 5.3、模式修改符
- 6、零宽断言
- 7、常用类
- 7.1、 Pattern
- 7.2、Matcher
- 7.3、字符串与正则
1、定义
正则表达式(了解):
正则表达式是用来描述具有一定特征的字符串的特殊字符串。Regular Expression。
作用: 可以用来对字符串进行验证、查找、替换、分割 。
1.1、 工具 RegexBuddy
2、字符集
默认情况下区分大小写。
2.1、 普通字符
写什么,匹配什么 非特殊含义以外的字符,如 a b 中国 上海 。
普通字符精确匹配
2.2、 元字符与转义
元字符: " ( ) [ ] { } \ ^ . $ * + ? | " 14个特殊字符
转义字符:\ + 字母
\d -> [0-9] 0~9之间一个数字
**\ \ --> \ **
\s --> 空格|制表符|换行符
**\ w --> word [A-Za-z0-9] ** AZ和a和0~9之间任何一个
3、字符类
3.1、 自定义
由 [ ] 组,只匹配一个, 需要注意以下四个:
- ^ : 如果在第一个位置,表示取反的含义。
- -:表示一个区间即范围
- ] : 最近一个位置为:*结束 ,如果要表示普通的]请加 *
- **\ ** : 转义
- . :在字符类中代表任意的字符。 如果需要表示原有的含义,挪动位置 或者加 \ 。
多行模式(缺省):除了换行符\r\n以外的任意一个字符, [ ^\n\r ] ;单行模式:可以匹配包含换行符在内的任意一个字符
3.2、默认|标准字符类
字符 | 含义 |
---|---|
\d | digit[0-9] , [0123456789] |
\w | word [A-Za-z0-9] |
\s | space 空格,制表符,换行符 |
. |
多行模式(缺省):除了换行符\r\n以外的任意一个字符, [ ^\n\r ] ; 单行模式:可以匹配包含换行符在内的任意一个字符 |
\D | [ ^\d ] [ ^0123456789 ] [ ^0-9 ] |
\W | [ ^\w ] 非字母, 数字, _, 即空白,标点符号及中文 |
\S | [ ^\s ] |
3.3、量词
匹配的过程中,需要指定次数。
- ***** :0个及以上
- + :1个及以上
- ? :0个或1个
- { n } : n次,非负数
- { n, } :大于或等于n次
- { n,m } :大于或等于n次,小于或等于m次
co*ke –> 不限个数的O :coke cooke coooke
co+ke –>至少一个 O co?ke ->1 个或零个 O :coke cke
co{0}ke ->0 个 co{5,}ke –>5 次及以上 :cke
co{5,8}ke –> 至少 5 次,最多 8 次 :cooke coooke coooke coooooke
[1-9]\d{3} –>大于等于 1000 小于等于 9999 的数 :1000 1002 9999
[1-9]\d{2,4} –>大于等于 100 小于等于 99999 的数 : 100 23433 9999
3.4、贪婪模式
在匹配次数不定时如 *, {n,}, + 匹配字符越多越好,默认模式即”贪婪模 ”
贪婪模式 greedy(匹配字符越多越好,可回溯)
? 懒惰模式 lazy reluctant (匹配字符越少越好,可回溯)
+ 独占模式 possessive(匹配字符越多越好,不可回溯)用的较少 cokecolacoooooooooooooke
.*o –>贪婪模式
.{2,}o–>贪婪模式
.{2,}?o –>懒惰模式
.{2,}+o –>独占模式,不可回溯 没有匹配到内容。
<.+?> ->找出标签 不要标签内的内容。不是<.+>
<[^>]+>->找出标签 不要标签内的内容。不是<.+>
阻止贪婪有两种方式:
1、 量词后面使用 ?
2、 使用取反
4、边界
1)、边界不占用宽度,只是一个界限
2)、
^ :开始
\b :单词边界
\B :非单词边界
$ :结束
^ :多行代表每行头 单行代表整个字符串的开始
$ : 多行代表每行尾 单行代表字符串的结尾
\b : 匹配前面或后面的不是\w
\B : 匹配前面或后面的是\w
^\bwrold\b$ :" wrold "
^\Bwrold\B$ :"00ddwrold00dd"
5、选择符与分组
5.1、选择符 |
| ->优先级低 ,满足匹配则停止,不会查找更优的方案
he|hello –>只匹配 he,不匹配 hello
hello|he->匹配 he 与 hello
5.2、分组 ( )
ab|c -> 匹配 ab c
a(b|c) -> 匹配 ab ac
\bget\b -> 只匹配 get “ 哈哈get 无语”
getvalue|get -> 匹配 get 和 getValue
get(value)? -> get getvalue
\band\b|\bor\b \b(and|or)\b -> 获取 and or
反向引用: \ 内部默认缓存,从第一个左括号计算,编号为 1 开始。
非捕获组: (?:xxx) : 不缓存组
(["'])(?:[^"']+)\1 ->不缓存第二组,不能引用第二组
(?:["'])(?:[^"']+)\1 –>所有的组都没有缓存,不能再引 用了。
5.3、模式修改符
( ?ism )*****( ?-ism )
- i : insensitive 使正则表达式对大小写不敏感;(重点)
- s : singleline 开启“单行模式”,即点号“.”匹配新行符;
- m : multiline 开启“多行模式”,即**“^”和“$”匹配新行符的前面和后面的位置**
- (?i)select(?-i) -> 不区分大小写。
(?i)she(?i) --》she SHE
(?s)she(?-s) --》she
s(?m)she(?-m)k --> she
6、零宽断言
前瞻(Lookahead) 后顾(Lookbehind)
(?=试试) 先行断言 | 先行断言 :断言自身出现的位置的后面能匹配表达式exp |
---|---|
(?<=shishi )后发断言 | 后发断言: 断言自身出现的位置的前面能匹配表达式exp |
(?!shishi) | 断言此位置的后面不能匹配表达式exp |
(?<!shishi) | 断言此位置的前面不能匹配表达式exp |
Java支持?、{m}、{n,m}等符号,但同样不支持*、+字符。Javascript干脆不支持后行断言
(?<=ing)(\w) -->"tings" s -前面(匹配前面)
(\w)(?<=ing) -->"tings" g --前面没有(即我们说的后面)(\w)(?=ing) --> "sing" s --------后面(匹配后面)
(?=ing)(\w) --》“sing” i --后面没有(即我们说的前面)
7、常用类
java.util.regex Pattern Matcher String
一般在查找、替换、分割、组的使用
String str = "jflkajl1sjlkfj kl1slkdfjlk1jdldksj";
String str1 = "jflkajl1sjlkfj kl3slkdfjlk5jdldk8sj";
//分隔 1
String[] arr = str.split("1");
System.out.println(Arrays.toString(arr));arr = str1.split("\\d");
System.out.println(Arrays.toString(arr));//String
String msg = "abc123qwe456";
String regex = "[a-z]{3}\\d+";
//matches(regex)判断当前字符串是否满足参数正则语法规则 -->完全匹配,子串匹配不可以
System.out.println(msg.matches(regex));
7.1、 Pattern
//Pattern 正则表达式表示类型 模式器
Pattern p = Pattern.compile("(ac*)(b+)");
Matcher m = p.matcher("aaaaacccbbaaab");
boolean b = m.matches(); //完全匹配
7.2、Matcher
//查找是否存在满足条件的字串,每次可以继续找到
//是否匹配
while(m.find()){//组//group() 获取查找的字串//group(int index) 获取当前匹配到的字串中指定索引分组的缓存内容System.out.println(m.groupCount()+"-->"+m.group()+"-->"+m.group(0));//0-->整个表达式//分组索引从 1 开始获取System.out.println(m.group(1)+"-->"+m.group(2));
}
/StringString msg = "abc123qwe456";String regex = "[a-z]{3}\\d+";//matches(regex)判断当前字符串是否满足参数正则语法规则 -->完全匹配,子串匹配不可以System.out.println(msg.matches(regex));
7.3、字符串与正则
String str ="and";
//完全匹配
boolean flag =str.matches("\\b(and|or)\\b");
System.out.println(flag);
str="\"happy\" and \"regex\" \"baidu\" or \"google\"";
//替换所有
str =str.replaceAll("\\b(and|or)\\b", "-->");
System.out.println(str);
//分割
str="\"happy\" and \"regex\" \"baidu\" or \"google\"";
//切割
String[] arr=str.split("\\b(and|or)\\b");
for(String temp:arr){ System.out.println(temp);
}
arr=str.split("m");
//没有对应的,返回本身
for(String temp:arr){ System.out.println(temp);
}
//. -->任意字符
str ="192.168.1.234";arr=str.split("\\.");
//注意转义
for(String temp:arr){ System.out.println(temp); }
Java SE 正则表达式相关推荐
- Java SE核心API(2) —— 正则表达式、Object、包装类
一.正则表达式 实际开发中,经常需要对字符串进行一些复杂的匹配.查找.替换等操作.而通过"正则表达式",就可以方便的实现这些功能. 正则表达式是一串特定字符,组成一个"规 ...
- Java SE 6之GUI:让界面更加绚丽(下)
在上一篇中我介绍了Java SE 6在GUI上的部分改进.在这篇文章中我接着介绍另外几种新的GUI功能.这些功能是: 1. 带有排序和过滤功能的JTable. 2. 增强的JTabbedPane组 ...
- java生日正则表达式_Java语言十五讲
前言 每年技术媒体都会评选最受欢迎的编程语言,Java总是高居前位.自然,没有办法说一个语言绝对比另一种语言好,这个话题一如既往地会引起大家无谓的争论不休.对别的行业的人来讲也许会觉得莫名其妙,但是对 ...
- Java复习总结(二)Java SE 面试题
Java SE基础知识 目录 Java SE 1. 请你谈谈Java中是如何支持正则表达式操作的? 2. 请你简单描述一下正则表达式及其用途. 3. 请你比较一下Java和JavaSciprt? 4. ...
- JAVA SE基础笔记
第一天 JDK安装.快捷键.JAVA语言特点 1.Java语言的概述 1.1 Java语言的背景 Java语言诞生于1995年,在编程语言排行榜占据重要的地位. Java语言之父是高斯林,以前隶属于 ...
- 【Java SE】JDK 8 以往版本
[Java SE]SE语法备忘(2) https://mp.csdn.net/postedit/90038581 JDK 8 以往版本 -------------------------------- ...
- java正则截取xml节点_实例讲述Java使用正则表达式截取重复出现的XML字符串功能...
Java使用正则表达式截取重复出现的XML字符串功能示例 本文实例讲述了Java使用正则表达式截取重复出现的XML字符串功能.分享给大家供大家参考,具体如下: public static void m ...
- oracle java rmi 漏洞,Oracle Java SE Java运行时环境RMI子组件远程漏洞(CVE-2011-3556)
发布日期:2011-10-20 更新日期:2011-10-20 受影响系统: Oracle Sun JRE 1.6.x Oracle Sun JDK 1.6.x 不受影响系统: Oracle Sun ...
- [零基础学JAVA]Java SE实战开发-37.MIS信息管理系统实战开发[JDBC](1)
MIS信息管理系统实战开发之使用MySQL实现保存 开发背景 ID.姓名.年龄为公共信息,而学生有成绩,工人有工资 定义一个抽象类Person(ID.姓名.年龄),学生是其子类,有成绩,工人是其子类有 ...
- java se 与j2se_关于java:J2EE和J2SE项目之间的区别
本问题已经有最佳答案,请猛点这里访问. 我已经从github下载了一个开源项目. 这是一个基于Maven的项目. 我如何理解该项目是J2SE项目还是J2EE项目? 这两种项目在结构上有何不同? Jav ...
最新文章
- 创建代码生成器可以很简单:如何通过T4模板生成代码?[下篇]
- springsecurity不拦截某个接口_SpringSecurity 默认表单登录页展示流程源码
- linux apache添加多站点配置(Ubuntn和Centos)
- javafx swing_JavaFX技巧9:请勿混用Swing / JavaFX
- oracle 打印值,oracle – 在SQL Developer中打印变量的值
- java键盘输入到文件中_在Linux中使用java和javac命令编译运行java文件
- Livebos--流程结束触发事件(修改表和表里的表格字段)
- vue隐藏和显示元素
- 为什么要使用 JavaScript
- 使用UltraISO将苹果dmg镜像转换标准ISO镜像
- 渗透测试员完整职业指南
- java csvwriter 追加_CSV文件每行的末尾追加写数据
- 我的电脑硬盘由SSD+HD组合,在HD上成功安装CentOS6.9
- android窗帘拉开动画,H5+CSS3窗帘拉开收起动画特效源码
- Python基础:文件和异常
- Keras Tuner官方教程
- android打开x86模拟器失败
- 获取多个字符串公共的前缀部分
- 小球碰壁反弹加分_canvas实现碰壁反弹(小球)
- Android实现LED数字显示
热门文章
- oracle用nas还是本地存储,为什么大家都在用NAS网络存储?
- 并行处理提高工作效率
- SAP中物料成本视图原始组的应用原理分析
- python爬取饿了么数据_爬取饿了么商铺信息
- Linux系统设置固定ip
- ceph pg peering和恢复 (2)
- python 经典图书排行榜_书榜 | 计算机书籍(9.2-9.8)销售排行榜
- 盘古开发框架集成 ShenYu 网关实现 Dubbo 泛化调用
- 大学老师招聘面试:说课和答辩
- mysql execute stmt_mysql_stmt_execute()