敞开掘金成长之旅!这是我参加「掘金日新方案 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
  • 查找完成后,运用多行修改
  • 增加注解代码后复制注释完成编写

正则表达式高效实践

还有许多操作,不能一一列举出来,只要熟练掌握了正则表达式,才能在各种复杂情况下运用的挥洒自如。

参考文献

  1. 菜鸟教程 – 正则表达式:www.runoob.com/regexp/rege…
  2. 维基百科 – 正则表达式:zh.wikipedia.org/wiki/正则表达式