敞开掘金成长之旅!这是我参加「掘金日新方案 12 月更文挑战」的第14天,点击查看活动概况
一、概述
正则表达式(Regular Expression)是计算机科学的一个概念,它运用单个字符串来描绘、匹配一系列契合某个句法规矩的字符串,在现在许多文本修改器或IDE开发工具里,正则表达式通常被用来查找或替换某个形式的文本。因而,灵活运用正则表达式,对某些问题能够另辟蹊径地快速处理。
二、语法
正则表达式的语法非常简练,学习起来也很好入门,所以重点是要如何能够灵活运用,能够快速处理一些问题。因而,这篇文章的重心首要放在实践,关于一些语法细节,随便去网上看看教程就能掌握。大部分教程的语法定义不一样,我就按照自己的理解,把语法部分分为代词、量词、元字符三部分。
1. 代词
代词是在匹配字符串时,能够代指某类或某个字符的表达式词。普通字符能够直接用来匹配,包括大写和小写字母、数字、标点符号等打印字符,以及换行符(\n
)、回车符(\r
)、制表符(\t
)等非打印字符。除此之外,常用的代词有:
字符 | 功用 |
---|---|
. |
匹配除 \r\n 之外的任何单个字符 |
\s |
匹配任何空白字符,包括空格、制表符、换页符等,等价于 [\f\n\r\t\v]
|
\S |
匹配任何非空白字符,等价于 [^\f\n\r\t\v]
|
\d |
匹配一个数字字符,等价于 [0-9]
|
\D |
匹配一个非数字字符,等价于 [^0-9]
|
\w |
匹配包括下划线的任何单词字符,等价于 [A-Za-z0-9_]
|
\W |
匹配任何非单词字符,等价于 [^A-Za-z0-9_]
|
假如需求匹配的字符与正则表达式的关键字符一样,在前面运用反斜杠(
\
)来转义,例如匹配中括号需求用\[\]
。
2. 量词
量词用于代词的后边,用来表明前面代词重复呈现的个数,代词后边不加量词则代表呈现一次且仅呈现一次,常用的量词有:
字符 | 功用 |
---|---|
? |
表明前面的字符最多只能够呈现一次(0次或1次) |
* |
表明前面的字符能够不呈现,或呈现一次或屡次(0次、1次或屡次) |
+ |
表明前面的字符有必要至少呈现一次(1次或屡次) |
{n} |
表明前面的字符呈现 n 次(n为非负整数) |
{n,} |
表明前面的字符至少呈现 n 次(n为非负整数) |
{n,m} |
表明前面的字符至少呈现 n 次,至多呈现 m 次(m和n为非负整数,n小于等于m) |
3. 元字符
元字符是正则表达式自带的特定功用的字符,具有定位或指定匹配规模等功用。常用的元字符有:
字符 | 功用 |
---|---|
匹配输入字符串的开端位置,能够是行首 | |
$ |
匹配输入字符串的完毕位置,能够是行尾 |
x|y |
匹配 x 或 y ,没有包围在括号里的,规模是整个正则表达式 |
[xyz] |
匹配所包括的恣意一个字符 |
[^xyz] |
匹配未列出的恣意字符 |
[a-z] |
匹配指定规模内的恣意字符,例如 [0-9],[A-Z] 等 |
(pattern) |
匹配 pattern 并获取这一匹配的子字符串,能够运用 $0...$9 能够获取匹配的字符串 |
三、实践
1. 区分贪婪形式和非贪婪形式
*
和 +
量词都是贪婪的,会尽或许多的匹配文字,在它们后边加上一个 ?
就能够完成非贪婪匹配。例如匹配下面带双引号的字符串:
Regular expression are used by string searching algorithms for "find" or "find and replace" operations on strings, or for input validation.
运用 ".*"
匹配的结果是 "find" or "find and replace"
。
运用 ".*?"
匹配的结果是 "find"
和 "find and replace"
。
2. 删去剩余空行
运用替换换行符来删去剩余空行,将呈现大于1次的换行符替换成1个换行符就能完成删去剩余空行。例如将下面文字中的剩余空行删去:
You say that you love rain,but you open your umbrella when it rains
You say that you love the sun,but you find a shadow spot when the sun shines
You say that you love the wind,but you close your windows when wind blows
This is why I am afraid,you say that you love me too
3. 简略获取文本中的URL
有些时候咱们需求从一堆文字中找到自己想要的信息,例如爬虫程序,此时能够运用正则来匹配信息,例如从下面一堆文字中找出有效的接口URL全路径:
DealerAll 1.100s Method arguments: "https://demo.mljr.com/crmappApi/dealer/all", "0", "1", "", "", "", "", "", "", "", "", "", "", ""
DealerGetDeptCondition 0.058s Method arguments: "https://demo.mljr.com/crmappApi/dealer/getDeptCondition", "0", ""
DealerListConditionMarkets 0.049s Method arguments: "https://demo.mljr.com/crmappApi/dealer/list/condition/markets", "0"
DealerPrivate 0.080s Method arguments: "https://demo.mljr.com/crmappApi/dealer/private", "0", "1", "", "", "", "", "", "loanOrderOneMonth", "desc", "", "", "", ""
StaffGetStaffInfo 0.111s Method arguments: "https://demo.mljr.com/crmappApi/staff/getStaffInfo", "0"
首要剖析方针文字特征,只要 https://
最初的双引号内的字符串才是接口URL,所以匹配过程如下:
- 输入
"https://.*?"
来匹配URL,注意这儿需求运用非贪婪形式 - 增加
.*"(https://.*?)".*
,运用括号来定位URL信息,前后运用.*
来匹配URL到行首和行尾的内容 - 替换内容为
$1
,取第1次匹配到的内容,这儿只要一组括号,所以第1次匹配的内容便是URL
4. 替换HTML标签内容
假如需求匹配已知最初结尾的字符串,能够运用正则表达式来获取,运用正则表达式的技巧并不是语法的难度,关键是要剖析出方针字符串的规律与特性,巧用查找与替换的技巧能够事半功倍,例如将下面HTML文件中的一级标题内容前面增加 Title
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Hello world</title>
</head>
<body>
<h1>AiJiangnan</h1>
<h1>AiJiangnan</h1>
</body>
</html>
所有的一级标题都是 <h1>...</h1>
,只需将它们匹配到并替换即可,过程如下:
- 输入
<h1>(.*?)</h1>
匹配所有的一级标题,注意运用非贪婪形式,而且标签内容运用括号定位 - 替换内容为
<h1>Title $1</h1>
,运用$1
取原有标签内容,在前面增加Title
完成替换
5. 巧用多行修改完成重复操作
现在大多数修改器都支持多行修改,运用正则表达式来查找出所有需求修改的位置,然后运用多行修改功用来完成大部分重复的工作,这能大大提高编码的功率。例如咱们在Java代码中定义了一个视图实体类,要增加Swagger注解来生成接口文档,能够从每个字段的注释中获取字段描绘来修改,示例过程如下:
- 剖析并查找方针字符串,这儿能够查找
private
- 查找完成后,运用多行修改
- 增加注解代码后复制注释完成编写
还有许多操作,不能一一列举出来,只要熟练掌握了正则表达式,才能在各种复杂情况下运用的挥洒自如。
参考文献
- 菜鸟教程 – 正则表达式:www.runoob.com/regexp/rege…
- 维基百科 – 正则表达式:zh.wikipedia.org/wiki/正则表达式