博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
正则表达式
阅读量:2421 次
发布时间:2019-05-10

本文共 2497 字,大约阅读时间需要 8 分钟。

目录

 

正则表达式用于匹配、校验字符串。

 

正则表达式语法

符号 描述
. 小数点,可匹配\n之外的任何一个字符,要匹配小数点,用\.
x x是某一具体字符,表示匹配该字符
\d 匹配0-9之间的一个数字
\D 匹配\d之外的任一个字符
\s 匹配任一个空白,包括空格、制表符、回车符、换行符
\S 匹配\s之外的任一个字符
\w 匹配任一个单词字符,包括数字0-9,英文字母大写26个、小写26个,下划线_
\W 匹配\w之外的任一个字符
\t 匹配空格、Tab之类的空白符
\n 换行符
\r 回车符

以上式子均只匹配一个字符

 

符号 描述
\ 转义,匹配正则表达式中的预定义的符号,例:\\匹配一个\, \(匹配一个(, \?匹配一个?
| 2项中选择一项,或,例:ab|c表示匹配ab或ac
() 作为整体看待

 

中括号

符号 描述
[ ] 匹配指定范围中的任一个字符,例:[abc]表示匹配a、b、c中的任一个字符。
- 连续范围,例:[a-z]表示匹配所有小写字母中的任一个字符,[\u4e00-\u9fa5]表示匹配任意一个中文字符
^ 非,例:[^a-d]表示匹配a、b、c、d之外的任一个字符。^会把后面的部分作为一个整体,eg. [^a-zA-Z0-9!@-],会把a-zA-Z0-9!@-作为一个整体
&& 交集,例:[a-d&&c-z]相当于[cd],匹配c、d中的任一个字符

中括号只匹配一个字符

 

数量限定

符号 描述
* >=0,至少0个
+ >=1,至少1个
? 0个或1个
{m} m个
{m,} 至少m个
{m,n} 至少m个,至多n个

限定的是前一个字符、子表达式出现的次数

 

位置限定

符号 描述
^ 行的开头,放在该部分前面,例:^H 表示匹配H,H要是一行的开头
$ 行的结尾,放在该部分的后面,例:o$ 表示匹配o,o要是一行的结尾
\b 单词的边界,前边界就放在该部分的前面,后边界就放在该部分的后面,例:\bH 表示匹配H,H要是单词的开头;H\b表示匹配H,H要是单词的结尾。
\B 不是单词的边界。不是前边界就放在该部分的前面,不是后边界就放在该部分的后面,例:\BH 表示匹配H,H不能是单词的开头;H\B表示匹配H,H不能是单词的结尾。

以上均是对一个字符、子表达式位置的说明。

 

数量匹配模式

1、Greedy(贪婪模式

数量限定默认使用贪婪模式,尽可能多的匹配字符。例:

\w{
2,5} 能匹配5个就匹配5个,不行就4个,再不行就3个...\w? ?表示匹配0个或1个,会优先匹配1个,没有才匹配0个\w+  +表示匹配1个及以上,优先匹配最多个

 

2、Reluctant(勉强模式)

尽可能少的匹配字符,也称最小匹配模式。需要在数量限定符后用一个额外的?来表示该部分使用最小匹配模式。例:

\w{
2,5}?  优先匹配2个\w?? ?匹配0或1个,优先匹配0个\w+?  +匹配1个及以上,优先匹配1个

?放在数量限定符后面,才表示前面部分使用最小匹配模式。

 

3、Possessive(占有模式)

在数量限定符后面用一个额外的+来表示该部分使用占有模式,这个不常用。

 

在java中使用正则表达式

两种方式

  • 使用String类的方法
  • 使用Pattern+Matcher两个类
     

使用String类的方法

// 整串匹配,用regex匹配整串boolean  matches(String  regex)"hello".matches("hello")  //true"hello".matches("he")  //false。 // 替换第一个匹配, 第一个参数是要匹配的串,正则表达式String  replaceFirst(String regex, String replacement)  // 替换所有匹配String  replaceAll(String regex, String replacement) //效果和replaceAll完全相同,只是第一个参数只能是字符、字符串,不能使用正则表达式String  replace(String target, String replacement) // 以regex作为切割符,把该串分割为字符串数组String[]  split(String regex)

 

实例

//去除中文字符str = str.replaceAll("[\u4e00-\u9fa5]","");//正则表达式匹配特定字符串str = str.replaceAll("hello","hi");

替换操作,原串不变,以新串形式返回。

正则表达式不用放在/ /中,直接写即可,但正则表达式预定义的字符要用\转义,又因为是在字符串中,\本身也要用\转义,所以转义要用 \\

 

使用Pattern+Matcher两个类

// 获取正则表达式对象Pattern  p=Pattern.compile(String regex);// 创建Matcher对象,参数指定要匹配的字符串Matcher  m=p.matcher(String str); // 用Matcher对象来操作boolean   b=m.matches();  //整串匹配boolean  b=m.find();  //匹配子串String  str=m.replaceFirst(String replacement);  //用指定字符串替换第一个匹配String  str=m.replaceAll(String replacement);  //用指定字符串替换所有匹配

 

说明

1、本来匹配正则表达式中预定义的符号要转义,比如匹配? 要写成 ? ,

但java把正则表达式作为字符串放在双引号中,只需转义\,比如 \w => “\w”,

其它预定义的符号,比如?、+、()、[ ]等等,不需要再用\转义。

 

2、对于常用的正式表达式,eg.匹配手机号、邮箱、网址等,可以找一个在线生成正则表达式的网站,直接粘过来用

转载地址:http://rgqlb.baihongyu.com/

你可能感兴趣的文章
太难了!开源项目如何商业化?
查看>>
谷歌排名第一的编程语言,死磕它这两点,小白也能学的会!不信你看!
查看>>
程序员掉头发的原因找到了 | 每日趣闻
查看>>
腾讯:我就是那只吃了假辣椒酱的憨憨。老干妈:企鹅你可长点心吧!
查看>>
倒计时1天 | 张钹院士领衔,AI开发者大会20大论坛全攻略!
查看>>
运维工程师的日常?? | 每日趣闻
查看>>
31 道 Java 核心面试题,统统打包给你!
查看>>
太拼了:谷歌第一编程语言小白也能学会!
查看>>
三分钟黑了阿里?马云下死命令留他?吴翰清辟谣:我没黑过阿里
查看>>
如果重新一次高考,你还会选择软件专业当程序员吗? | 每日趣闻
查看>>
如何设计一个安全可靠的 API 接口?
查看>>
一年一度程序员“补课”季来袭,618 背后技术大公开!
查看>>
我和美国 AI 博士聊了聊:2020 年,这件事比存钱更重要!
查看>>
陈芳,高考之后我要学计算机专业,将来做 IT 发财了,我就娶你!
查看>>
“编程能力差的程序员,90%输在这事上!”谷歌AI专家:都是瞎努力!
查看>>
张一鸣做电商:再造一个“抖音”
查看>>
“你写的 Bug 让我来改好吗” | 每日趣闻
查看>>
大厂技术文档:Redis+Nginx+Spring全家桶+Dubbo精选
查看>>
笑死,别再黑程序员了好吗? | 每日趣闻
查看>>
Python 爬取 13966 条运维招聘信息,这些岗位最吃香
查看>>