java学习笔记--简单掌握正则表达式
正则表达式: 主要用于操作字符串的规则
用于检索替换那些符合规定的文本
预定义字符
. 任何字符
. 就单纯代表.
\d是 数字
\D 非数字
\s 空白字符 包括\t \n \r
\S 非空白字符
\w 单词字符 比如 a—z A-Z _还有0到9
\W 非单词字符
如果预定义字符没有加上数量词 那就只能匹配一个字符
数量词:
? 一次或者一次也没有
* 0次或者多次
+ 1次或者多次
{n}恰好n次
{n,} 至少n次
{n,m} 至少n次,但是不超过m次
范围词:
没有数量词就只能匹配一个字符
[abc] 在abc内
[^abc] 除了abc外
[a-zA-Z] a到z或者A到Z 两头字母包括在内
[a-d[m-p]]a到d或者m到p 并集
[a-d&&[def]] 交集
匹配功能
举个例子:
String match="1[12a]\\d{2}"; System.out.println(number.matches(match)?"ok":"flase");//number是被匹配的字符串 意思就是第一个为1 第二个为1或2或a 接下来的为数字并且有且只有两个
再举例:
String match="a\\d{0,2}[a]{2}";
第一个为a 第二个开始后0个到2个内必须为数字 剩下的两位必须为a
数量词如{2} 必须跟范围词或者预定义符后面有效 是对这两个的修饰
切割功能
举例:根据空格来对字符串进行切分
String str = "aa.bb.cc"; str = "-1 99 4 23"; String[] arr = str.split(" +"); //+这里代表一个或者多个空格
再举例:根据重叠词进行切割
String str = "sdqqfgkkkhjppppkl"; String[] arr = str.split("(.)\\1+");
注意:为了提高规则复用,用()进行封装,每一个括号都有一个编号,从1开始,为了复用这个规则。可以通过编号来完成该规则的调用。需要对编号数字进行转义。\1就代表获取1组规则。
等于说 第一次获得s 然后\1引用 变成ss+ 无法切割 然后下一个
替换:
String name="wocao141311164sdfsdf1232"; String reg="1[2345]\\d{3}"; String aa=name.replaceAll(reg, "****"); //将满足条件的内容替换成****格式
替换重复的
String name="wo我洗爱你你你"; String reg="(.)\\1+"; String aa=name.replaceAll(reg,"$1");
如果需要在replaceAll方法正则的时候外部引用组的内容 要使用$组号
查找:
范例:
Pattern p = Pattern.compile("a*b"); Matcher m = p.matcher("aaaaab"); boolean b = m.matches();
**注意:步骤:
1,先将正则表达式编译成正则对象。使用的是Pattern类一个静态的方法。compile(regex);
2,让正则对象和要操作的字符串相关联,通过matcher方法完成,并返回匹配器对象(Matcher)。
3,通过匹配器对象的方法将正则模式作用到字符串上对字符串进行针对性的功能操作**
查找三个的单词
String str = "da jia zhu yi le,ming tian bu fang jia,xie xie!"; String reg="\\b[a-zA-Z]{3}\\b"; Pattern pattern=Pattern.compile(reg); Matcher matcher= pattern.matcher(str); while(matcher.find()) { System.out.println(matcher.group()); }
先find(寻找有没有满足的 然后下移位置)才可以group(得到满足条件的字符串)
\b是边界词 不匹配 只表示开始和结束
匹配emil:
String str = "123sdfsd@sin.com.cn"; true str="1@1.1"; false String reg="[a-zA-Z_0-9]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+"; System.out.println(str.matches(reg));
网络爬虫:emil
String content="有事没事联系:112312@12.com 又是没事士大夫似的说的说的1211112312@22.cn1211dfsd1@22.cn.com"; String reg="[a-zA-Z1-9]\\w{5,7}@[a-zA-Z0-9]{2,}(\\.(com|cn|net)){1,2}"; Matcher matcher= pattern.matcher(content); while(matcher.find()) { System.out.println(matcher.group()); }
我认为的重点:
\b 熟悉: 匹配的是位置
\b 匹配这样的位置:它的前一个字符和后一个字符不全是(一个是,一个不是或不存在) \w
String str = "sshello world"; String reg="hello\\b"; Pattern pattern=Pattern.compile(reg); Matcher matcher= pattern.matcher(str); while(matcher.find()) { String name=matcher.group(); System.out.println(name); }
抽象出来直接看区别:
**String str = “sshello world”;
String reg=”hello\b”;**
返回hello
分析:
以hello结尾
**String str = “ss hello,world”;
String reg=”\bhello”;**
返回hello
分析:
以hello开头
就用 “It’s a nice day today.” 举例说明:
正确的正则:\bnice\b
分析:第一个 \b 前面一个字符是空格,后面一个字符是 ‘n’,不全是 \w,
所以可以匹配出 ‘n’ 是一个单词的开头。第二个 \b 前面一个字符是 ‘e’,
后面一个字符是空格,不全是 \w,可以匹配出 ‘e’ 是一个单词的结尾。
所以,合在一起,就能匹配出以 ‘n’ 开头以 ‘e’ 结尾的单词,
这里就能匹配出 “nice” 这个单词。
举例:
String str = “ss shello world”;
String reg=”hello\b w”;
返回hello w
分析:
以hello结尾 空格w开始 的内容
String str = “ss shello world”;
String reg=”hello\bw”;
失败
分析:
hello后面跟着w 违反了\b前后不能同时为\w所以匹配不到 reg就写错了
String str = “ss shello,world”;
String reg=”hello\b.w”;
返回 hello,w
虽然.是任何字符都行 但是还是要根据str来判断 如文中 ,不是\w所以可以匹配到
如果是String str = “ss shellosworld”; 则无法匹配到

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
10分钟,带你掌握C++多线程同步!
摘要:本文介绍了C++11中如何开启新线程,并详细讲解了线程的基础同步原语:mutex, lock_guard, unique_lock, condition variable和semaphore等。如何采用async, packaged_task和promise实现future同步机制?怎样处理spurious wakeup?本文以质数判定服务为例为大家分享C++多线程同步措施! 数十款阿里云产品限时折扣中,赶紧点击这里, 领劵开始云上实践吧! 本次直播视频精彩回顾, 戳这里! 演讲嘉宾简介: 陶云峰,阿里云高级技术专家,上海交通大学理论计算机科学博士,专注数据存储、分布式系统与计算等领域,写了20多年程序。2000年参加ACM/ICPC大赛,实现亚洲队伍进World Final前十的突破。 以下内容根据演讲嘉宾视频分享以及PPT整理而成
- 下一篇
体验一键php/java环境安装工具oneinstack
概述 这个东西其实我很早之前就听说了,但是一直没有去尝试使用,我一直使用的是lnmp一键安装包,但是lnmp一键安装包是安装java环境的,oneinstack更强大一点 官网 https://oneinstack.com/ 环境准备 首先使用vagrant创建一个虚拟机,如果不会使用vagrant,那么就在我的博客里面搜索vagrant这个关键词就好了vagrant box add ubuntu/xenial64vagrant init ubuntu/xenial64vagrant upvagrant ssh 其实具体的操作和docker-machine差不多啦,就是它是针对虚拟机而不是容器而已 使用oneinstack 其实oneinstack源码存储在很多地方,国内阿里云和又拍云,国外Linode和sourceforge都有,所以不存在说我使用国外的服务器的时候下载源码很慢,或者使用国内服务器的时候下载源码很慢的问题,真的很良心,我是从又拍云下载的wget http://mirrors.linuxeye.com/oneinstack-full.tar.gz一般下载速度就是满速下载...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器