- 性 质
- 汉语词汇
- 外文名
- zhèngzé
- 出 自
- 《楚辞·离骚》等
- 中文名
- 正则
-
2022-03-21 12:34:44
目录
高质量博主,点个关注不迷路🌸🌸🌸!
I. 序言:JavaScript中正则表达式的使用场景
本期博客带大家了解一下JavaScript中如何使用正则表达式,那么最开始,序言的"序言"部分,我先解释一下为什么有这篇文章:
序言的"序言":
首先必须说明的是,这类文章(js正则表达式)在c站或者整个it类论坛是很多人写过的,而我认为我这篇的不同之处在于更加“小白”化,这也与我一贯的风格有关吧。
关于JavaScript正则表达式,其他的文章大多一上来就太过激进,不利于初学者学习(我当粗就是这么被劝退的),这也是我为什么要坚持写这篇文章,希望小白在看了这篇文章后,不管能不能完全掌握JavaScript正则表达式,但至少对JavaScript正则表达式能有一个比较深刻的印象吧。
那下面正式进入序言部分,我们先了解一下为什么在JavaScript中需要正则表达式,这里如果之前学过其他编程语言,应该大致对正则表达式会有一个理解,但没有学过的也不用担心:
正则表达式大白话就是一个能判定你的输入内容是否符合设计者规定的一个式子
从大白话,不难听出,它有以下的作用:
1️⃣ 测试字符串是否合规
这种特性常被用来检测前端输入的字段是否符合要求,常见的场景是注册时输入账号、密码、邮箱等的测试。
2️⃣ 替换某确定的文本
这种特性能够使我们通过js批量替换某个已存在的文本,替换为我们需要的文本,作用场景比较多,就不一一举例了。
3️⃣ 从字符串中提取一个子字符串/是否包含某子字符串
最后一个特性用的不是很多,但是的确可以实现:通过设置提取需求,从长字符串批量提取子字符串。第二重特性,是否包含某子字符串,可以用来过滤一些字符串。
以上是正则表达式在前端的作用,其实正则表达式不仅仅用于前端,在很多时候也能做一些其他文本的匹配和替换工作(因此学会了js中它的用法,在其他语言也可以轻松掌握,因为重在思想),在前端,它更多时候工作在上面的第一个作用:校验输入的字段。
II. 创建第一个正则表达式
首先,是时候见证真正的技术了,我们尝试在js里书写第一个属于我们的正则表达式:
var regexp_1 = /a/; var regexp_2 = new Regexp("a");
上面,我给了两种写法,这两种写法,常用的是第一种,第一种与第二种完全等效,都是创建一个正则表达式(以后看见代码里字符串有俩斜线包裹,别再怀疑了,就是正则!)。
没错,这就是正则表达式的创建方法,是不是灰常简单,没有那么高大上吧。上面创建的正则表达式,表达的含义是匹配字符‘a’,且没有特殊的匹配规则。
别看上面只有这么简单的一个表达式,其实它已经可以被我们去使用了,我们看下面这个例子:
<script> function demo() { var regexp_1 = /a/; var str = 'abc' alert(regexp_1.test(str)) } demo() </script>
这上面的就是一个小例子,当然了大家不用管里面的test函数,因为我们还没讲到,不过大家先记住:
test函数是正则表达式最基础的一个函数,作用是对传入的字符串进行固定格式、内容的匹配。(后面部分会再点到这个函数)
这里我们了解一下我们写的正则表达式是可以被使用的,因为上面的代码就涉及了一个简单的正则表达式的使用。
III. 常见的正则表达式属性
📕 三种匹配规则
首先介绍一下正则表达式的三种匹配规则:
匹配规则符号 规则含义 i 匹配时忽略大小写 g 执行全局匹配(会匹配整个语句,而非匹配到第一个目标后终止) m 执行多行匹配 它们的语法是这样的:
var regexp_1 = /a/i; var regexp_2 = /a/g; var regexp_3 = /a/m; var regexp_4 = new Regexp("a","i"); var regexp_5 = new Regexp("a","g"); var regexp_6 = new Regexp("a","m"); var regexp_7 = new Regexp("a","igm"); var regexp_8 = /a/igm;
上面展示了两种正则表达式定义方法下的匹配规则的语法:
对于第一种正则表达式,我们直接在斜线后加上匹配规则对应的符号即可;
对于第二种正则表达式,我们在括号里传入第二个参数即可,参数仍然是对应的符号;
补充:其实不传入参数、斜线后面不写任何东西,代表了默认情况,也就是普通的正则匹配。
最后要说明的是,可以有多种规则同时执行,例如可以同时忽略大小写、全局匹配(需要几个就加几个参数符号)。
我们拿忽略大小写做一个小demo:
<script> function demo() { var regexp_1 = /a/; var regexp_2 = /a/i; var str = 'Abc' alert(regexp_1.test(str)) alert(regexp_2.test(str)) } demo() </script>
其中,第一个弹窗是False,第二个是True,大家也可以点这里试验一下:【点我揭晓】
📕 五种常见属性
接下来,我们讲解一下五种常见的正则表达式的属性:
啥,你问我啥叫正则表达式的五种属性?就是 /a/ 的五种属性,这句话就是这么理解的,也就是这个表达式会有五种属性,它们分别是:
属性 说明 ignoreCase 返回一个布尔值,True代表正则表达式设置了 i 匹配规则(忽略大小写),False代表未设置。 global 返回一个布尔值,True代表正则表达式设置了 g 匹配规则(全局匹配),False代表未设置。 multiline 返回一个布尔值,True代表正则表达式设置了 m 匹配规则(多行匹配),False代表未设置。 lastIndex 返回一个int值,表示下一次搜索开始的索引位置,只在设置了 g 匹配规则时才有实用意义。 source 返回一个字符串,字符串是正则表达式的字符串形式(不含斜线) 除了lastIndex,其他四个大家应该都能从字面理解,关于lastIndex,我会在下一个部分单独介绍它。
📕 规则g的使用详解
最后,由于规则g:全局匹配,不容易理解,我们单独拿出来讲一讲,而且讲g的同时,顺便把上面提到的lastIndex也一起讲了:
我们先看这样一个字符串:
str = 's_s_s_s_s_s_s_s'
假如目标是匹配s,那么使用普通的正则表达式,例如:
regexp = '/s/'
我们确实匹配了,但是只匹配了第一个s,换句话说没有把所有的s匹配到,那么如果我们想要把整个句子里的s都匹配一下,这时 g 就发挥作用了:
我们现在有需求:匹配每一个s,并依次输出s的索引,此时我们的第一步是定义一个g模式的正则表达式:
var regexp = '/x/g'
那么索引要怎么办呢?哎这时候就用到了lastIndex,还记得吗,它代表了下一次正则表达式匹配的起始索引:
<script> function demo() { var regexp = /s/g var str = 's_s_s_s_s_s_s_s' regexp.test(str) alert(regexp.lastIndex) regexp.test(str) alert(regexp.lastIndex) regexp.test(str) alert(regexp.lastIndex) regexp.test(str) alert(regexp.lastIndex) regexp.test(str) alert(regexp.lastIndex) } demo() </script>
此时,我们就实现了索引的获取(注意,这里弹出的并不是索引,是索引加一,减去一就是真正的索引)
IV. 常见的正则表达式方法举例介绍
📘 test方法
首先当然是我们最常用的test()方法了,它有以下功能:
test() 方法是正则表达式最常用一个方法,用于检测一个字符串是否匹配某个模式.
test ()方法检查字符串是否与给出的正则表达式模式相匹配,如果是则返回 true,否则就返回 false,这一点在刚才上面的小案例里,大家都有体会。
同时搭配g模式,test方法也可以进行全文的检查,上面的demo也有提到,这里不过多赘述。它的标准语法格式是这样的:
var regexp = /xxx/ var str = 'xxx' var boolean_value = regexp.test(regexp)
📘 正则子表达式匹配
在讲exec()方法之前,我们插播一个知识点:子表达式匹配。
什么意思呢?我们观察一下之前写的正则表达式,都是一整个式子进行匹配,那么有没有可以在一个式子里有一些子式子的写法呢?大家可能到这儿没有太理解子表达式的意思,那我举个例子:
现在有这样一个式子:
str = 'st_s_s_s_s_s_s_s'
我想要先匹配 st_ 这个字符串,那么正则表达式大家都会写:
var regexp = /st_/
那如果我接下来想要,先匹配一下st_,匹配到之后再匹配一下里面的 t 和 _ ,也就是我想要一次把st_ 、t 和 _ 都匹配出来,要怎么办呢?这样写就可以了:
var regexp = /s(t)(_)/
于是我们知道了,括号的内容代表子表达式,而且在第一次匹配时,它会默认把所有的括号去掉,做一个整体匹配,例如上面的例子,第一波匹配时,表达式相当于是: /st_/ 。
只有整体匹配成功,后面的子字符串匹配才会被执行匹配,否则如果整体没有匹配到,即使子字符串能匹配到内容,也都会被返回空值。(这句话先不用理解,下面的exec()方法会再讲)
📘 exec方法
exec()方法,比普通的test()方法更加复杂,同时能做的事情也更复杂:
exec() 方法用于检索字符串中的正则表达式的匹配。
exec()方法返回的是一个字符串的数组:
当整句匹配失败时,会返回一个null的空数组;
否则,有:数组的第0个元素存储的是整句匹配到的字符串,第1个元素存放的是第一个引用型分组(子表达式)匹配的字符串,第2个元素存放的是第二个引用型分组(子表达式)匹配的字符串,依次类推。
看到这里,我要开始填坑了:刚才提到了如果整句匹配失败,那么即使子字符串能够成功匹配,也会被返回空值,是什么意思呢?我们举一个例子,看下面的代码:
<script> function demo() { var regexp = /s(t_)(_)/ var str = 'st_s_s_s_s_s_s_s' var list = regexp.exec(str) document.write(list[0]) document.write('<br>') document.write(list[1]) document.write('<br>') document.write(list[2]) } demo() </script>
这段代码大家现在肯定能看懂,那么有奖竞猜:上面代码执行之后,页面上会被写什么内容?
答案是:【点我揭晓】
是不是出乎意料?啥也没有是吧?那就对了,因为这就是整句匹配失败的后果,我们解析一下:
首先,由于包含子字符串,我们第一次先整句匹配,把括号取消,那么正则表达式变成:
regexp = /st__/(注意,这里是有两个下划线的)
于是真相很明显了:st__不存在,所以整句匹配失败了,于是即便子字符串s_和_能够被匹配到,一样不会有结果,到这里我算是把这块给大家讲清楚了?
那么大家应该对exec()方法有一定了解了,那我最后举一个成功实现多匹配的例子:
<script> function demo() { var regexp = /s(t)(_)/ var str = 'st_s_s_s_s_s_s_s' var list = regexp.exec(str) document.write(list[0]) document.write('<br>') document.write(list[1]) document.write('<br>') document.write(list[2]) } demo() </script>
大家发现,我只是把第一个子表达式的下划线去掉了,那么结果截然不同,这次三个内容都被写上去了,大家可以自行查看:【点我揭晓】
这里有人就很"贪心了",可能会问list[3]是啥呀?
list[3]是undefined,因为exec()方法只会执行一次匹配,因此它在三个表达式(总式、两个子表达式)匹配之后就会停止,因此一共只有三个值。
📘 字符串的常见函数
最后是字符串的常见函数,注意,各位别弄混了,这是字符串的常见函数,调用函数的对象是字符串,不是正则表达式,但是传参可以是正则表达式:
var str = 'xxx' // 1. search(): 检索字符串中与指定的子字符串或正则表达式相匹配的子字符串。 // 返回找到的第一个字符的位置,如果未找到返回-1 // 该方法将忽略"g"标志和正则对象的lastIndex属性(即总是从开头找起) var index = str.search(Regexp/String); // 2. match(): 在字符串内查找一个或多个与正则表达式匹配的字符串,返回一个对象 // 若没开启"g"标志,将只查找第一个匹配的字符串,返回一个对象 // 该对象包含下标0、index、input,其中下标0等价于index,input是String的引用 // 开启"g",返回一个数组,数组的length是匹配的字符串个数,每个元素是每个匹配的起始字符位置 var list = str.match(Regexp/String) // 3.replace() : 用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串 str.replace(yourRegexp/String,new_String)
V. 正则表达式的常见匹配语法汇总
这部分,我用一张图给大家展示一下常见的匹配语法,大家可以记住图上的一些语法,但不必都记住,需要的时候点开看就行,图大家可以自行收藏(原创,大家勿二改):
VI. 实例:一个简单的注册校验
最后,给大家送一个简单的注册校验:
<!DOCTYPE html> <html> <head> <title>简单注册校验</title> <meta charset='utf-8' /> <style> </style> <script> function check() { var number = document.getElementById("number").value; if (number == "") { alert("手机号不能为空哦"); return false; } if (/^[0-9][1-9]{10}$/.test(number) == false) { alert("手机号的格式不对"); return false; } var pwd = document.getElementById("pwd").value; if (pwd == "") { alert("密码不能为空"); return false; } if (pwd.length < 6) { alert("密码的长度太短,应大于6"); return false; } if (pwd.length > 12) { alert("密码的长度太长,应该小于12"); return false; } if (/[A-Z]/.test(pwd) == false) { alert("密码至少要包含一个大写字母"); return false; } var pwd2 = document.getElementById("pwd2").value; if (pwd != pwd2) { alert("两次输入的密码不一样,请重新输入"); return false; } return true; } </script> </head> <body> <h2 style="text-align: center;">注册账户</h2> <form method="post" name="myform" onsubmit="check()"> <table align="center"> <tr> <td>请填写注册手机号:</td> <td><input id="number" name="number" type="text" /></td> </tr> <tr> <td>请填写注册密码:</td> <td><input id="pwd" name="password" type="password"></td> </tr> <tr> <td>请再次输入密码:</td> <td><input id="pwd2" name="password" type="password"></td> </tr> </table> <input type="submit" name="btn" value="注册" style="display: block;margin: 0 auto;margin-top: 50px;"> </form> </body> </html>
大家可以根据从文中学习到的知识点,丰富上面这个案例,可以参考一些现成的网站注册页面,做更多的校验!
以上是本期的全部内容,喜欢的小伙伴们可以三连支持一下!💓💓💓!
另外本期博客参与了【新星计划】,还请大家支持一下🌟🌟🌟!
更多相关内容 -
正则表达式正则表达式.zip
2020-12-15 21:23:25正则表达式正则表达式.zip -
前端正则判断前端正则判断
2018-12-26 19:49:20前端正则判断前端正则判断。前端正则判断前端正则判断。前端正则判断前端正则判断。前端正则判断前端正则判断。前端正则判断前端正则判断。前端正则判断前端正则判断。 -
易语言正则万能匹配
2020-07-22 19:00:57易语言正则万能匹配源码,正则万能匹配,正则元字符转义,文本_替换,创建,取正则文本,替换,取匹配数量,取匹配文本,取子匹配文本,取子匹配数量 -
javascript正则表达式基础篇
2020-10-27 15:42:19主要是介绍javascript正则表达式的一些基础知识,主要是介绍javascript的正则书写方法与常用实例,需要的朋友可以参考下 -
易语言正则表达式文本替换
2020-07-23 10:00:15易语言正则表达式文本替换源码,正则表达式文本替换,子程序_正则文本替换 -
Tikhonov正则化MATLAB程序
2019-03-13 16:24:55关于解决病态方程组常用的Tikhonov正则化方法,对开始学习求解不适定问题有比较大的意义。 -
家庭住址正则表达式
2018-12-22 22:16:44比较准确的判断家庭住址是否正确,较网上的更新了,简单明了方便使用 -
正则式工具(自动生成正则表达式)
2020-10-20 23:32:50自动生成正则式,对正则式进行检验,很好的工具~ 自动生成正则式,对正则式进行检验,很好的工具~ 自动生成正则式,对正则式进行检验,很好的工具~ 自动生成正则式,对正则式进行检验,很好的工具~ -
车牌号码正则校验
2018-09-03 14:52:36车牌号码校验,车牌号码校验 -
JS正则表达式的使用以video标签为例
2018-12-05 16:57:02使用JS正则表达式,选取video元素的src属性的值,利用jQuery选取元素 -
各种正则表达式.txt
2020-08-26 17:25:48邮箱,手机号,日期,通行证,等等各种正则表达式.txt各种正则表达式.txt各种正则表达式.txt各种正则表达式.txt各种正则表达式.txt各种正则表达式.txt各种正则表达式.txt各种正则表达式.txt各种正则表达式.txt -
数据库url正则表达式校验
2018-07-12 15:41:38该文档是针对mysql和oracle数据库url地址的校验问题。 -
正则表达式语法及常用正则表达式(附正则手册)
2018-08-06 15:23:29正则表达式基础语法及常用正则表达式及正则手册(HTML版) -
E正则小助手V1.3易语言正则调试工具.zip
2019-09-04 20:27:36E正则助手可帮助用户快速学习实践正则,学习正则处理文本,输入正则表达式进行正则匹配、正则替换、生成正则代码,支持多行模式、区分大小写、支持库模式。本程序采用易语言自带正则表达式支持库与Deelx版支持库编写... -
一看就懂:正则表达式
2022-02-09 13:58:23在讲正则表达式前,我们不妨先从一个场景来逐渐引入。 你可能有过这样的经历:我们去某些网站注册帐号,当你在设置密码的时候,网站会提示你密码的长度范围,以及对应的规则限制(如下图)。 根据上图,我们将...目录
案例引入
在讲正则表达式前,我们不妨先从一个场景来逐渐引入。
你可能有过这样的经历:我们去某些网站注册帐号,当你在设置密码的时候,网站会提示你密码的长度范围,以及对应的规则限制(如下图)。
根据上图,我们将密码设置规则可以描述为两个条件:
(1)长度为6-16位;
(2)密码中必须包含数字,大写字母,小写字母,特殊字符(指定字符);
现在假设我们不知道正则表达式,作为程序员的你,该如何去实现这样一个密码验证呢?
下面是我写的一个校验方法(样本):
/** * 校验用户密码是否满足设置规则 * * @param password 用户输入的密码 * @return true-满足;false-不满足 */ public static boolean checkPassword(String password) { // 密码不能为空 if (password == null || password.isEmpty()) { return false; } // 校验密码长度(6-16位) int len = password.length(); if (len < 6 || len > 16) { return false; } // 定义四种组合条件 boolean hasNumber = false; boolean hasSmallLetter = false; boolean hasBigLetter = false; boolean hasSpecialChar = false; // 将密码字符串拆分为单个字符,然后对每个字符进行校验 char[] chars = password.toCharArray(); for (char c : chars) { // 是否包含数字0-9 if (c >= '0' && c <= '9') { hasNumber = true; continue; } // 是否包含小写字母a-z if (c >= 'a' && c <= 'z') { hasSmallLetter = true; continue; } // 是否包含大写字母A-Z if (c >= 'A' && c <= 'Z') { hasBigLetter = true; continue; } // 是否满足指定的特殊字符 if ("~@#S%*_-+=:.?".indexOf(c) > 0) { hasSpecialChar = true; continue; } // 如果某个字符不在上面四种情况,则不满足规则 return false; } // 如果四种组合条件均满足,则符合密码设置规则 return hasNumber && hasSmallLetter && hasBigLetter && hasSpecialChar; }
这个方法写得对不对呢?我们不防用几组密码去进行验证下:
可以看到,我们列举的8组密码,都得到了验证,说明我们的方法是OK的。
但这样一个密码设置规则校验,我们就差不多写近 30 行的代码,是不是感觉有点累赘了呢?明明规则很简单,代码量却写了这么多,有没有什么方法可以简化我们的代码呢?当然有!于是,这时就可以让我们今天的主角正则表达式出场了。
下面,则是具有相同校验功能,基于正则表达式的验证方法:
/** * 通过正则表达式校验用户密码是否满足设置规则 * * @param password 用户输入的密码 * @return true-满足;false-不满足 */ public static boolean checkPasswordByRegex(String password) { return Pattern.matches("^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[~@#S%*_\\-+=:.?])[A-Za-z0-9~@#S%*_\\-+=:.?]{8,20}$", password); }
那么它写得到底对不对呢?于是,我们可以通过上面的示例数据,继续调用该方法来进行验证:
通过结果我们可以看到,他也是符合我们预期的。于是我们发现,在不用正则表达式的时候,我们的代码量近30行,而使用了正则表达式,代码就浓缩为了1行,也就是说,使用正则表达式时可以简化我们的代码。
但同时我们也可知,正则表达式具有一定的学习成本,如果你不懂正则表达式,那么你看它可能就是一头雾水,如果出了问题,更也就无从下手去修改它了。
所以,学会正则表达式还是有必要的,至少以后你的同事写出来后,不会在脑子里出现 "这是写的啥玩意儿啊?怎么我看不懂" 的想法。
正则表达式
什么是正则表达式?通过上面的案例大家可能多少有点了解了。是的,他就是通过一行字符串,来描述一定的规则(如下图箭头所指红框处)。
命名规范
正则表达式的英文为 Regular Expression,所以我们通常采用这两个单词的首几个字母合在一起,把正则表达式相关的变量名定义为 regexp(单数) 或 regexps(复数) 。
比如:
又比如,在 Java 的 String 类中,有几个相关替换的方法,它也是支持正则表达式的,他的参数命名也是 regex 。
结构组成
正则表达式通常由一些普通字符,以及一些元字符组成。
普通字符:就是本身作为一个字符时,它不具有其他含义,像我们常用的大小写字母和数字。
元字符:就是除了本身作为一个字符外,他还可以表达其他含义(下图是部分元字符节选)。
其实,我们学习正则表达式,大部分就是基于元字符的学习。
用途场景
学习了正则表达式,我们可以有哪些用途场景呢?
(1)做字符串的规则验证(比如前面的案例引入中,我们可以通过正则表达式来验证一个密码是否符合规则)。
(2)做字符串的替换(比如将一个字符串中所有的大小写字母去掉,或者替换为指定符号)。
(3)提取字符串中所需要的字符(比如一个字符串中所有的数字提取出来,组成一个新的字符串)。
Java中的正则校验
正则表达式主要用途就是校验字符串,那么在Java中,只需要通过下面这个方法即可进行校验。
boolean result = Pattern.matches(regex, input);
其中:
regex 是我们需要写的正则表达式校验规则;
input 是我们待校验的字符串;
返回的 result 就是我们校验的结果,当为 true 的时候,表示校验通过,当为 false 的时候,则表示校验不通过。
正则元字符
正则:普通字符
当我们的正则表达式为一串普通字符(不包含元字符)时,校验字符串只有和正则一致时,才会校验通过。
具体效果如下:
说明:后面例子为节省篇幅,不显得累赘,就不再贴代码,只贴校验结果。
正则:\d
\d 表示一个数字。
如:
aaa\d: 表示验证的字符串后面必须以 aaa 开头,且以一个数字结尾。
aaa\dbbb:aaa和bbb中间有一个数字
aaa\d\d:aaa后面跟2个数字
注意:在Java定义的正则里,由于一个\表示的是字符串转义,因此在Java定义带有\的元字符时,还需要多写一个\,即\\,至于其他语言,自己可查阅相关资料进行了解。
正则:\D
\D 表示一个非数字,它和上面 \d 的意思恰好相反。
如:
\D\D\D: 则表示一个长度为3,不包含数字的字符串。
111\D222:则表示111和222中间,必须包含一个非数字。
正则:\w
\w 表示一个字母(大小写均可)、数字,或下划线。
如:
12\w45:则表示12和45中间必须是一个字母,数字,或下划线。
正则:\W
\W 与 \w 相反,表示这个位置的字符既不是字母、数字,也不是下划线。
也就是:特殊符号(除下划线),或者空格等满足。
如:
12\w45:则表示12和45中间是一个非字母,非数字,或非下划线。
正则:\s
\s 表示匹配一个看不见的符号,即空格或制表符(Tab键)
如:
88\s99:则表示88和99中间须是一个空格或制表符。
(由于我的编辑器设置了1个制表符替换为4个空格,所以这里就不列举制表符情况了)
正则:\S
\S 与 \s 相反,表示一个可以看得见的符号。
如:
88\S99:则表示88和99中间须有一个看得见的符号。
正则:.
. (小数点) 则表示“\n”和"\r"之外的任何单个字符。
如:
.... :则表示任意四个字符
正则:|
| (竖线) 则表示或的关系,表示检测的字符串须满足其中一个时,才符合条件。
如:
aa|bb|cc:则表示输入的字符串须是aa,或bb,或cc其中的一个。
注意,如果我们或者关系的前后还有其它字符时,需要用()将他们包裹起来。
如:
xx(aa|bb|cc)yy:则表示输入的字符串须是xx开头,yy结尾,且中间是aa,或bb,或cc其中的一个。
正则:[abc]
[ ] 表示匹配其中任意一个字符。
如:
a[bcd]e:则表示a和e的中间须是b,或c,或d其中的一个
注意:用 | 表示其中之一,他可以是字符,也可以是字符串。而只用中括号时,则只表示其中一个字符。
正则:[^abc]
[^ ] 表示不与中括号里的任意字符匹配。
如:
a[^bcd]e:则表示a和e的中间除b,c,d这三个字符外,其他的字符都满足。
正则:[a-z]
[值1-值2] 则表示值1到值2中间的所有字符都满足(包括值1和值2)。常用该正则来表示大小写字母范围,数字范围。
如:
a[b-d]e:等同于 a[bcd]e,因为 b-d 其实就是b,c,d三个数。
a[0-9]e:则表示a和e中间是一个数字,等同于 a\de(前面说过\d表示一个数字)
正则:[^a-z]
[^值1-值2] 则表示除值1和值2之外的所有字符,都可以满足。
如:
a[^1-3]e:则表示a和e中间的字符,只要不是1,2,3,则都满足。
正则:\num
这里的num指number,也就是数字,当\后面跟数字,表示匹配第几个括号中的结果。
比如:现在有 abcd 字符串,当我们用小括号把 c 包裹起来后,然后在字符串后面写上 \1,即 ab(c)d\1,则这里的 \1 就指 c,因为 \1 表示第1个小括号中的结果。
ab(c)d\1:等同于 abcdc 。
如果我们继续把 ab(c)d\1 中的 d 包括起来,并在后面写上 \2,即 ab(c)(d)\1\2, 那么这里的 \2 就表示 d 这个字符,因为第2个小括号的结果是 d,所以整个表达式就等同于 abcdcd 。
ab(c)(d)\1\2:等同于 abcdcd,也等同于 ab(cd)\1 。
正则:?
? 表示匹配前面的子表达式零次或一次。
如:
abc?de: 表示可匹配的字符串为 abde (匹配0次c) 或 abcde (匹配1次c)。
正则:+
匹配前面的子表达式一次或多次 (次数 >= 1,即至少1次)
如:
abc+de:ab 和 de 之前至少有一个 c 。
正则:{n}
这里的 n 是一个非负整数。匹配确定的前面的子表达式 n 次。
如:
abc{3}de:表示 ab 和 de 之间有3个c。
ab(xx|yy){3}de:表示 ab 和 de 之间有 xx 或 yy 的个数, 一起合计为3个。
正则:{n,m}
m和n均为非负整数,其中 n<=m。最少匹配 n 次且最多匹配 m 次。
如:
abc{2,3}de:表示 ab 和 de 之间有 2 到 3 个 c。
正则:*
表示匹配前面的子表达式任意次。
如:
abc*de:表示 ab 和 de 之间有任意个数(包括0)c 。
-
“正则表达式”教程.rar
2020-04-05 20:34:50“正则表达式”教程.rar “正则表达式”教程.rar “正则表达式”教程.rar “正则表达式”教程.rar “正则表达式”教程.rar “正则表达式”教程.rar -
正则测试软件
2018-04-11 00:21:59正则测试软件正则测试软件正则测试软件正则测试软件正则测试软件正则测试软件正则测试软件正则测试软件正则测试软件 -
C#正则表达式.zip
2021-06-06 12:47:45C#正则表达式.zip -
python 正则表达式 re 学习.pdf
2020-01-15 11:32:00Python 正则 re,Python 正则 re,Python 正则 rePython 正则 re,Python 正则 re -
正则测试小工具,兼容好无需联网
2022-07-07 17:54:42正则测试小工具,测试自己写的正则是否符合预期,支持99%的浏览器运行。 正则测试小工具,测试自己写的正则是否符合预期,支持99%的浏览器运行。 正则测试小工具,测试自己写的正则是否符合预期,支持99%的浏览器... -
正则表达式大全
2018-08-31 10:45:02这是一个正则的压缩包,里面包括了一般的正则,js的正则。正则基础教学 -
正则表达式
2018-01-09 15:06:15正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式 -
java正则表达式实例(邮箱,车牌,密码,url,IP,身份证,车牌等等)
2017-08-10 08:52:58正则表达式 实例 -
Java正则表达式(一看就懂)
2022-04-02 07:57:25Java正则表达式 一看就懂 拿来即用
- 💂 个人主页: 陶然同学
- 🤟 版权: 本文由【陶然同学】原创、在CSDN首发、需要转载请联系博主
- 💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦
- 💅 想寻找共同成长的小伙伴,请点击【Java全栈开发社区】
它来了!!!
看了热榜正则表达式都上榜了目前正则表达式榜一是Python的 经过这几天呕心沥血不眠不休 终于今天Java的正则表达式它来了 还有练习题 耗时9981个小时 都是干货 赶紧收藏起来!!!!
1.概念
正则表达式:正确规则的表达式
通常用来检测字符串是否符合某规则、根据某规则切分字符串 或 替换符合规则的文本
例如:
检查校验字符串中的 QQ 号是否如何如下规则:
①必须为 5~15 位数字
②不能以 0 开头
若使用之前代码:
以上要求就可以变成一个正则表达式:[1-9][0-9]{4,14}
通过正则表达式,我们就可以检查字符串中的 QQ 号是否符合要求了。2.字符串正则的常用方法
举例:校验手机号码
1:要求为 11 位数字
2:第 1 位为 1,第 2 位为 3、4、5、7、8 中的一个,后面 9 位为 0 到 9 之间的任意数字。
代码演示:
String phone = "18810022666";
String regex = "1[34578][0-9]{9}";
boolean flag = phone.matches(regex);方法名 描述 boolean matches(String regex) 当前字符串是否匹配给定的正则表达式
String replaceAll(String regex,String replacement) 使用 replacement 替换当前字符串中所有符号正则表
达式的内容
String[] split(String regex) 根据给定的正则表达式拆分当前字符串
练习:
1、举例:校验 qq 号码.
1:要求必须是 5-15 位数字
2:0 不能开头
代码演示:
String qq = "604154942";
String regex = "[1-9][0-9]{4,14}";
boolean flag2 = qq.matches(regex);2、
举例:校验手机号码
1:要求为 11 位数字
2:第 1 位为 1,第 2 位为 3、4、5、7、8 中的一个,后面 9 位为 0 到 9 之间的任意数字。
代码演示:
String phone = "18810022666";
String regex = "1[34578][0-9]{9}";
boolean flag = phone.matches(regex);3、
举例:将字符串中的数字全部替换成!号
String str = "1a2b3c4d";
str = str.replaceAll("\\d", "!");
System.out.println(str);4、
//根据空格切割字符串
String str = "我 很 帅";
String[] arr = str.split(" ");
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}5、注意:.的正则写法必须为\\.
//根据.切割 IP 地址
String str = "192.168.11.88";
String[] arr = str.split("\\.");
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}所以这些练习题你都学废了嘛
3.常见正则表达式
表达式 描述 ^[a-z0-9_-]{3,16}$ 用户名 ^[a-z0-9_-]{6,18}$ 密码 ^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$ 电子邮箱 [\u4e00-\u9fa5] 匹配中文字符的正则表达式 练习:
1、从控制台输入一个字符串。使用正则来对字符串进行一系列操作:
①判断字符串是否是一个合格的用户名
②将字符串中的数字用”#”号替代. 数字的正则:[0-9] 或者 \\d
③根据”#”号将字符串切割成字符串数组并遍历展示4.正则表达式-参考附录
参照帮助文档,在 Pattern 类中有正则表达式的的规则定义,正则表达式中明确区分大小写字母。我们
来学习语法规则。4.1规则
规则:x
含义:代表的是字符 x
例如:匹配规则为 "a",那么需要匹配的字符串内容就是 ”a”规则:\\\\
含义:代表的是斜线字符'\\'
例如:匹配规则为"\\\\" ,那么需要匹配的字符串内容就是 ”\\”规则:\\t
含义:制表符
例如:匹配规则为"\\t" ,那么对应的效果就是产生一个制表符的空间规则:\\n
含义:换行符
例如:匹配规则为"\\n",那么对应的效果就是换行,光标在原有位置的下一行规则:\\r
含义:回车符
例如:匹配规则为"\\r",那么对应的效果就是回车后的效果,光标来到下一行行首规则:[abc]
含义:代表的是字符 a、b 或 c
例如:匹配规则为"[abc]",那么需要匹配的内容就是字符 a,或者字符 b,或字符 c 的一个规则:[^abc]
含义:代表的是除了 a、b 或 c 以外的任何字符
例如:匹配规则为"[^abc]",那么需要匹配的内容就是不是字符 a,或者不是字符 b,或不是字符
c 的任意一个字符规则:[a-zA-Z]
含义:代表的是 a 到 z 或 A 到 Z,两头的字母包括在内
例如:匹配规则为"[a-zA-Z]",那么需要匹配的是一个大写或者小写字母规则:[0-9]
含义:代表的是 0 到 9 数字,两头的数字包括在内
例如:匹配规则为"[0-9]",那么需要匹配的是一个数字规则:[a-zA-Z_0-9]
含义:代表的字母或者数字或者下划线(即单词字符)
例如:匹配规则为" [a-zA-Z_0-9] ",那么需要匹配的是一个字母或者是一个数字或一个下滑线规则:.
含义:代表的是任何字符
例如:匹配规则为" . ",那么需要匹配的是一个任意字符。规则:\\d
含义:相当于[0-9]。代表的是 0 到 9 数字,0 和 9 包括在内。
例如:匹配规则为"\\d ",那么需要匹配的是一个数字规则:\\w
含义:相当于[a-zA-Z_0-9]。代表的字母或者数字或者下划线
例如:匹配规则为"\\w ",,那么需要匹配的是一个字母或者是一个数字或一个下滑线4.2边界匹配器(以x开头或结尾)
边界匹配器:^
含义:代表以某些内容开头边界匹配器:$
含义:代表以某些内容结尾边界匹配器:\\b
含义:代表的是单词边界。
注意:不能单独使用,几乎不使用
例如:匹配规则为"\\b[abc]\\b",那么代表的是字母 a 或 b 或 c 的左右两边需要的是非单词字符
([a-zA-Z_0-9])String regex = "\\b[a]\\b";
String str = "a";
booleanflag = str.matches(regex);4.3数量词
数量词:X?
含义:代表的是 X 出现 0~1 次
例如:匹配规则为"a?",那么需要匹配的内容是一个字符 a,或者一个 a 都没有
数量词:X*
含义:代表的是 X 出现 次数≥0
例如:匹配规则为"a*",那么需要匹配的内容是多个字符 a,或者一个 a 都没有数量词:X+
含义:代表的是 X 出现 次数≥1
例如:匹配规则为"a+",那么需要匹配的内容是多个字符 a,或者一个 a数量词:X{n}
含义:代表的是 X 出现 次数= n
例如:匹配规则为"a{3}",那么需要匹配的内容是 3 个字符 a数量词:X{n,}
含义:代表的是 X 出现 至少 n 次
例如:匹配规则为"a{3, }",那么需要匹配的内容是最少有 3 个字符 a数量词:X{n,m}
含义:代表的是 X 出现至少 n 次,但是不超过 m 次
例如:匹配规则为"a{5,8}",那么需要匹配的内容是有 5 个字符 a 到 8 个字符 a 之间4.4逻辑运算符
逻辑运算符:XY
含义:代表的是 X 后紧跟着 Y
例如:匹配规则为"ab",那么需要匹配的字符串内容就是 ”ab”逻辑运算符:X|Y
含义:代表的是 X 或 Y
例如:匹配规则为"a|b",那么需要匹配的字符串内容就是 ”a”或”b”逻辑运算符:(X)
含义:代表的是()括号内的数据作为一个整体出现
例如:匹配规则为"(hello)+",那么需要匹配的内容是组内数据要出现多次,如”hellohellohello”;
或者组内数据出现一次,如”hello”。写在最后
我们的Java正则表达式就结束了 欢迎大家添加博主交流 练习过程中遇到问题也可以提供支持 如果需要学习资料 博主也可以推荐
最后 如果觉得文章对您有帮助 请给博主点赞、收藏、关注 博主会不断推出更多优质文章!
-
正则指引书籍
2018-04-23 22:59:36正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式 -
文件路径的正则表达式
2015-02-27 14:09:31其中包括windows和linux文件路径的正则表达式;去除空格和斜杠转换的replaceall方法 -
源码(精通正则表达式&实战正则表达式)
2017-05-23 23:54:05javascript 正则表达式视频教程 包含:精通正则表达式五部视频,实战正则表达式两部视频和源码压缩包 -
Python正则表达式(一看就懂)
2022-03-30 18:28:37目前越来越多的网站、编辑器、编程语言都已支持一种叫“正则表达式”的字符串查找“公式”,有过编程经验的同学都应该了解正则表达式(Regular Expression 简写regex)是什么东西,它是一种字符串匹配的模式...目录
特殊字符使用反斜杠"“引导,例如”\r"、"\n"、"\t"、"\"分别表示回车、换行、制表符号与反斜线自己本身
哈喽O(∩_∩)O😄
今天来发一下python正则表达式,其实这个也是比较简单的
肝了好几个小时才写出来呀
什么是正则表达式(⊙_⊙)
目前越来越多的网站、编辑器、编程语言都已支持一种叫“正则表达式”的字符串查找“公式”,有过编程经验的同学都应该了解正则表达式(Regular Expression 简写regex)是什么东西,它是一种字符串匹配的模式(pattern),更像是一种逻辑公式。
简单说,正则表达式是…
python中必备的工具,主要是用来查找和匹配字符串的。
正则表达式尤其在python爬虫上用的多。
正则表达式怎么用❓
首先,我们要导入
头文件(写c++写习惯了)模块import re
因为re是内置模块,所以不需要额外安装,就很银杏
sreach的用法🍊
匹配连续的多个数值🍉
import re r=r"\d+" m=re.search(r,"YRYR567eruwgf")#目标是567 print(m)
re模块中,r“\d+”正则表达式表示匹配连续的多个数值,search是re中的函数,从"YRYR567eruwgf"字符串中搜索连续的数值,得到"567"
结果:
可以看到,搜索到了连续值“567”
字符"+"重复前面一个匹配字符一次或者多次🍉
import re r=r"b\d+" m=re.search(r,"a12b1233cd") print(m)
这样,结果就是b后面的连续数字
结果:
字符"*"重复前面一个匹配字符零次或者多次🍉
“*" 与 "+"类似,但有区别,列如:
可见 r"ab+“匹配的是"ab”,但是r"ab “匹配的是"a”,因为表示"b"可以重复零次,但是”+“却要求"b"重复一次以上import re r=r"ab+" m=re.search(r,"acabc") print(m) r=r"ab*" m=re.search(r,"acabc") print(m)
结果:
字符"?"重复前面一个匹配字符零次或者一次🍉
匹配结果"ab”,重复b一次
import re r=r"ab?" m=re.search(r,"abbcabc") print(m)
结果:
特殊字符使用反斜杠"“引导,例如”\r"、"\n"、"\t"、"\"分别表示回车、换行、制表符号与反斜线自己本身
import re r=r"a\nb" m=re.search(r,"ca\nbcaba") print(m)
结果:
完整表🔍
其实上面说这些都是比较基础,比较简单的,还有复杂一点的,都在这张表里
match用法🤔
match用法😃
语法:re.match(pattern, string[, flags])
从首字母开始开始匹配,string如果包含pattern子串,则匹配成功,返回Match对象,失败则返回None,若要完全匹配,pattern要以$结尾。
#示例: name='张三' if re.match('张\w+',name): print('{},你好!'.format(name)) # 张三,你好!
输出结果:张三,你好
张三:谁叫我?
不开玩笑了,继续
总的来说,match就是
- 返回匹配的match对象
- 默认从给定字符串的开头开始匹配、即使正则表达式没有用^声明匹配开头
match对象🍊
Match对象的几个属性:
注意,前面是有“.”的
1..string 待匹配的文本
2..re 匹配使用的pattern对象
3..pos 正则表达式搜索文本的开始位置
4..endpos 正则表达式搜索文本的结束位置
Match对象的几个方法:
1.group(0) 返回匹配到的子串
2.start() 返回匹配子串的开始位置
3.end() 返回匹配子串的结束位置
4.span() 返回start()、end()数量词🍊
匹配开头、结尾🍊
匹配分组🔍
好了,看了上面几张表,其实我觉得最重要的在下面
match总结😄
其实没啥好总结的,但你要看懂这张图,这个很重要
我框出来的是我自己感觉经常用的
其实我自己刚学的时候也听不懂,现在觉得可简单了
所以,你应该现在就觉得很简单吧?
但是,正则表达式的字符很多,容易记混,一不小心就好几十个报错,很让人崩溃
实践出真知 凸(`0´)凸 ☀️
学了这么多,是不是想撸个程序了?
已经给你准备好了
程序效果:输入手机号,通过正则表达式判断手机号合不合法,
如果合法,就输出这个手机号的信息(所属地等)
如果不合法,就重新输入,简单吧?
这里我想重点说一下怎么获取手机号的信息
我一开始打算上网上百度一波的,没想到直接复制过来23个报错、我也是醉了
哎呀,不能再发表情包了
ε=(´ο`*)))唉,还是自己写吧、、、
我想起了有个模块叫phone,可以实现这个功能
但是你可能还没有安装这个模块,要按命令行模式下输入pip install phone
等个六六四十九秒就下载下来了
然后你就可以体验一下了
代码(PyCharm运行通过)
import phone from time import * import re def begin(): print("欢迎来到查询小程序") print("1.查询") print("2.用户") def p(n): if re.match(r'1[3,4,5,7,8]\d{9}', n): if re.match(r'13[0,1,2]\d{8}', n) or \ re.match(r"15[5,6]\d{8}", n) or \ re.match(r"18[5,6]", n) or \ re.match(r"145\d{8}", n) or \ re.match(r"176\d{8}", n): return True elif re.match(r"13[4,5,6,7,8,9]\d{8}", n) or \ re.match(r"147\d{8}|178\d{8}", n) or \ re.match(r"15[0,1,2,7,8,9]\d{8}", n) or \ re.match(r"18[2,3,4,7,8]\d{8}", n): return True else: return True else: return False if __name__ == "__main__": s=0 begin() while True: op = int(input("请输入:")) if op==1: phoneNum = str(input("请输入你的电话号码")) if p(phoneNum)==False: print("该手机号无效") for i in range(100): print('\n') begin() else: info = phone.Phone().find(phoneNum) print("手机号码:"+str(info["phone"])) print("手机所属地:"+str(info["province"])+"省"+str(info["city"])+"市") print("邮政编号:"+str(info["zip_code"])) print("区域号码:"+str(info["area_code"])) print("手机类型:"+str(info["phone_type"])) s+=1 i = input("输入任意数退出...") for i in range(100): print('\n') begin() if op==2: print("使用次数:"+str(s)) i = input("输入任意数退出...") for i in range(100): print('\n') begin()
写在最后🧐
感觉这次的博客好像比较长,你能看到这里,已经超越了60%的人了,如果有谁还不是很明白,或者有c++和python的问题,都可以私信我,我看到后会一一回复哦
另外,互粉必回💪
感谢您的阅读,拜拜!
-
java正则表达式替换字符串
2015-06-27 09:19:35java正则表达式替换字符串