正则表达式
首发:https://mp.weixin.qq.com/s/kS…
这里只单纯介绍正则表达式,不会波及其余。
根本的介绍下正则表达式,并解说一些根本的应用办法和案例。
这篇实用于正则表达式新手入门学习,不讲太多的实践,偏差实战中练习!
先学会怎么用,用的过程中,再摸索其中的逻辑。
是什么
正则表达式是什么?
正则表达式(Regular Expression)是用于形容一组字符串特色的模式,用来匹配特定的字符串。通过特殊字符 + 一般字符来进行模式形容,从而达到文本匹配目标工具。
说白了,正则表达式是一种工具,次要是用来提取和替换字符串。
测试工具
在咱们写正则表达式的过程中,咱们可能会测试表达式的正确性,这时候就要应用到测试工具
我这里应用的是 RegexTester.exe
请自行下载!
RegexTester 根本应用
有 2 种模式,一个查找一个替换,依照须要抉择
查找
填好正则表达式和待匹配的字符串,点击运行即可显示后果
这里说下后果的 0,1,2,3,4….
0:示意的就是整个正则表达式匹配到的后果,
1:示意第 1 个括号中匹配到的后果
2:示意第 2 个括号中匹配到的后果
以此类推
替换
替换和查找相似,多了一个替换项,其实就是先查找,将查到的字符串,依照替换项的规定进行替换
$1:示意的是 这里是查找到的第 1 个括号中匹配到的后果
$2:示意的是 这里是查找到的第 2 个括号中匹配到的后果
以此类推
实例详解
就间接上案例了,案例中的所有正则表达式都在图中,我并没有给到能够间接复制粘贴,本人复现一遍,印象更深
复现的过程中,如果有正则语法、元字符、特殊字符等不懂的,能够查看下附表或者自行百度
实例 1:
当初有一个待匹配字符串:
结构正则表达式的办法和创立数学表达式的办法一样。也就是用多种元字符与运算符能够将小的表达式联合在一起来创立更大的表达式。
需要:匹配其中的 表达式
3 个汉字
这里咱们能够看到,间接用 表达式
作为正则表达式即可,咱们匹配到了 4 个中央
实例 2:
需要:匹配所有的 正则表达式
实例 3:
需要:咱们要匹配所有的 正则表达式
和数据表达式
办法 1
咱们晓得 .
能够用来匹配除了换行符外的任意字符,因为 表达式
后面 2 个字符变动的,咱们用点来代替
咱们能够看到,匹配到了 4 个后果,不过其中有 2 个不是咱们想要的,优化一下
这样就能失去咱们想要的后果了
这里的 [^ 的]
的意思是匹配除了 的
以外的任意字符
办法 2
下面的形式,在当前情况下,是能够匹配到精确的字符串,然而如果换一个,可能匹配到一些咱们不须要的字符串,上面咱们再准确点
这里正则表达式的意思是:
小括号示意:一个组
竖线|
示意或者的意思
总的就是匹配满足前 2 个字符是 正则
或者 数学
,后三个字符是 表达式
的字符串
实例 4:
源文本:
{url: "./202108/t20210810_1259734.html", title: '峄城区卫生衰弱局 2021 年 7 月卫生监督行政处罚案件', time: "2021-08-05", source:'',}
{url: "./202107/t20210721_1249763.html", title: '峄城区市场监管局对于对枣庄越强网络科技有限公司等 240 家企业', time: "2021-07-22"}
{url: "./202107/t20210721_1291713.html", title: '行政处罚...', time: "2021-07-22", source:'',}
需要:提取其中所有的 url
咱们看下咱们想要的 url 有什么特色,第一个是后面有 url:
标识,第二个它们被蕴含在 2 个引号之间
所以咱们能够这样写
\s*
:示意匹配 0 到多个任意空白字符
[^"]*?
:示意匹配匹配除 "
以外的全副字符,非贪心匹配(对于贪心匹配和非贪心匹配不理解的能够百度下)
实例 5:
源文本:
{url: "./202108/t20210810_1259734.html", title: '峄城区卫生衰弱局 2021 年 7 月卫生监督行政处罚案件', time: "2021-08-05", source:'',}
{url: "./202107/t20210721_1249763.html", title: '峄城区市场监管局对于对枣庄越强网络科技有限公司等 240 家企业', time: "2021-07-22"}
{url: "./202107/t20210721_1291713.html", title: '行政处罚...', time: "2021-07-22", source:'',}
需要:提取其中所有的 title
和实例 4 差不多
实例 6:
源文本:
{url: "./202108/t20210810_1259734.html", title: '峄城区卫生衰弱局 2021 年 7 月卫生监督行政处罚案件', time: "2021-08-05", source:'',}
{url: "./202107/t20210721_1249763.html", title: '峄城区市场监管局对于对枣庄越强网络科技有限公司等 240 家企业', time: "2021-07-22"}
{url: "./202107/t20210721_1291713.html", title: '行政处罚...', time: "2021-07-22", source:'',}
需要:提取前 2 个字符是 峄城
的 title
实例 7:
源文本:
{url: "./202108/t20210810_1259734.html", title: '峄城区卫生衰弱局 2021 年 7 月卫生监督行政处罚案件', time: "2021-08-05", source:'',}
{url: "./202107/t20210721_1249763.html", title: '峄城区市场监管局对于对枣庄越强网络科技有限公司等 240 家企业', time: "2021-07-22"}
{url: "./202107/t20210721_1291713.html", title: '行政处罚...', time: "2021-07-22", source:'',}
需要:提取前 2 个字符是 峄城
的 title 所对应的 url
实例 8:
源文本:
{url: "./202108/t20210810_1259734.html", title: '峄城区卫生衰弱局 2021 年 7 月卫生监督行政处罚案件', time: "2021-08-05", source:'',}
{url: "./202107/t20210721_1249763.html", title: '峄城区市场监管局对于对枣庄越强网络科技有限公司等 240 家企业', time: "2021-07-22"}
{url: "./202107/t20210721_1291713.html", title: '行政处罚...', time: "2021-07-22", source:'',}
需要:提取大括号中的字符串
这种个别次要用来提取行
实例 9:
源文本:
{url: "./202108/t20210810_1259734.html", title: '峄城区卫生衰弱局 2021 年 7 月卫生监督行政处罚案件', time: "2021-08-05", source:'',}
{url: "./202107/t20210721_1249763.html", title: '峄城区市场监管局对于对枣庄越强网络科技有限公司等 240 家企业', time: "2021-07-22"}
{url: "./202107/t20210721_1291713.html", title: '行政处罚...', time: "2021-07-22", source:'',}
需要:有的 title 中有蕴含...
,然而咱们并不需要
这时候咱们就用到正则替换
这里的 .
要用 \
进行本义,因为在正则中.
默认是匹配除换行符的任意字符
咱们要将 ...
替换为空,所以替换项,咱们留空
实例 10:
源文本:
{'USCC': '92340503MA2PMQ0T13', 'ID': '2cc5dea5-700a-4724-92f5-b81cd97d0cb5', 'CF_GXRQ': '2021-08-05', 'NAME': '马鞍山市万丰超市'}
需要:将 USCC 补充成残缺的 url
残缺的 url 如下:
http://xy.mas.gov.cn/queryDou…
咱们能够发现,url 前面的 USCC= 的值,就是源文本中 USCC 的值,然而当初咱们只有源文本,须要本人拼成 url,该如何用正则实现呢
第一步:咱们先提到源文本中 USCC 的值
第二步:写替换项
咱们提到了 USCC 的值,用 $1 来代替它,因为咱们要在值的后面,加上 url 前缀,http://xy.mas.gov.cn/queryDoublePublicInfo?USCC=$1
,其余的字符不变
实例 11:
源文本:
{'USCC': '92340503MA2PMQ0T13', 'ID': '2cc5dea5-700a-4724-92f5-b81cd97d0cb5', 'CF_GXRQ': '2021-08-05', 'NAME': '马鞍山市万丰超市'}
需要:在实例 10 的根底上,我想间接获取到 url
咱们是能够先实现实例 11 中的步骤,让后间接提 USCC 的值即可,这种就不具体说了,很简略
然而当初想用一个正则替换间接获取到正确的 url
因为正则替换是替换你查找到的字符串,没有提到的,不会进行替换,因为咱们最初只留下 url,所以要不源文本全副提到,进行替换解决
实例 12:
源文本:
{'USCC': '92340503MA2PMQ0T13', 'ID': '2cc5dea5-700a-4724-92f5-b81cd97d0cb5', 'CF_GXRQ': '2021-08-05', 'NAME': '马鞍山市万丰超市'}
需要:在实例 11 的根底上,略微在简单一些,同样是间接获取到 url
残缺的 url 是这样的:
http://xy.mas.gov.cn/queryDou…
能够看到这里有 2 个参数
逻辑其实和下面一样的,就是多了一步,将 id 的值也提到,进行正则替换
留神
“|”和“[]”的区别:
- 竖线 | 是或者的关系,竖线两边任意匹配一边都成立
- 中括号 [] 是括号外部选一的关系,即:括号外面的字符,只有匹配到一个,即成立 ([] 是一个字符汇合)
正则中的替换
是将匹配到的数据替换为别的数据,没有匹配到数据是不变的
$1、${1}: 示意从 0 开始数,第一个小括号匹配的内容,
\s\S
和 .
的区别
\s\S
:匹配全副字符.
:匹配除换行符外的全副字符
附录:正则匹配大全
- ^ 匹配字符串的结尾
- $ 匹配字符串的开端。
- . 匹配任意字符,除了换行符,当 re.DOTALL 标记被指定时,则能够匹配包含换行符的任意字符。
- […] 用来示意一组字符, 独自列出:[amk] 匹配 ‘a’,’m’ 或 ’k’
- 1 不在 [] 中的字符:2 匹配除了 a,b,c 之外的字符。
- re* 匹配 0 个或多个的表达式。
- re+ 匹配 1 个或多个的表达式。
- re? 匹配 0 个或 1 个由后面的正则表达式定义的片段,非贪心形式
- re{n} 准确匹配 n 个后面表达式。例如,o{2} 不能匹配 “Bob” 中的 “o”,然而能匹配 “food” 中的两个 o。
- re{n,} 匹配 n 个后面表达式。例如,o{2,} 不能匹配 ”Bob” 中的 ”o”,但能匹配 “foooood” 中的所有 o。”o{1,}” 等价于 “o+”。”o{0,}” 则等价于 “o*”。
- re{n, m} 匹配 n 到 m 次由后面的正则表达式定义的片段,贪心形式
- a| b 匹配 a 或 b
- (re) 匹配括号内的表达式,也示意一个组
- (?imx) 正则表达式蕴含三种可选标记:i, m, 或 x。只影响括号中的区域。
- (?-imx) 正则表达式敞开 i, m, 或 x 可选标记。只影响括号中的区域。
- (?: re) 相似 (…), 然而不示意一个组
- (?imx: re) 在括号中应用 i, m, 或 x 可选标记
- (?-imx: re) 在括号中不应用 i, m, 或 x 可选标记
- (?#…) 正文.
- (?= re) 前向必定界定符。如果所含正则表达式,以 … 示意,在以后地位胜利匹配时胜利,否则失败。但一旦所含表达式曾经尝试,匹配引擎基本没有进步;模式的残余局部还要尝试界定符的左边。
- (?! re) 前向否定界定符。与必定界定符相同;当所含表达式不能在字符串以后地位匹配时胜利
- (?> re) 匹配的独立模式,省去回溯。
- \w 匹配字母数字及下划线
- \W 匹配非字母数字及下划线
- \s 匹配任意空白字符,等价于 [\t\n\r\f].
- \S 匹配任意非空字符
- \d 匹配任意数字,等价于 [0-9].
- \D 匹配任意非数字
- \A 匹配字符串开始
- \Z 匹配字符串完结,如果是存在换行,只匹配到换行前的完结字符串。
- \z 匹配字符串完结
- \G 匹配最初匹配实现的地位。
- \b 匹配一个单词边界,也就是指单词和空格间的地位。例如,‘er\b’ 能够匹配 ”never” 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。
- \B 匹配非单词边界。’er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。
- \n, \t, 等. 匹配一个换行符。匹配一个制表符。等
- \1…\9 匹配第 n 个分组的内容。
- \10 匹配第 n 个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。
- [\u4e00-\u9fa5] 匹配汉字
更多教程:https://www.runoob.com/regexp/regexp-tutorial.html
关注我获取更多内容
- … ↩
- abc ↩