引言
作为一名面向对象开发人员,相信大家一定遇到过给类的私有成员变量写setter/getter函数的情形,当一个类包含十几个私有变量时,这个过程一定是非常痛苦的,这时你肯定在想,要是能一键批处理这项工作就好了,如下图1所示。
图1 getter/setter 批量设置
今天就给大家带来这样一款高效的批量文本处理工具——正则表达式。
tip:本文档中使用的编辑工具为Visual Studio Code v1.103.2
一、什么是正则表达式?
正则表达式,原名Regular Expression,顾名思义,就是一个符合规则约束的字符串,由普通字符和特殊字符组成,用于匹配文本中符合规则的所有字符串。
它最初由数学家斯蒂芬·科尔·克莱尼在1956年提出,现在是搜索和操作文本的一个强有力工具。
二、基础语法
1. 表达式的字符
普通字符:字面含义就是字符的含义,所见即所得。
特殊字符:也叫元字符,具有特殊含义的符号,字面含义并非字符的含义。如果需要匹配特殊字符本身,则需要使用反斜杠进行转义。
2. 普通字符
普通字符类别
实例
字母
a-z,A-z
数字
0-9
符号
!,@,#,%,_,(空格) 等
3. 特殊字符(元字符)
特殊字符类别
实例
基本元字符
. (点符号)
匹配除换行符(\n)外的任意单个字符
\(反斜杠)
转义字符,还原后面的字符的字面含义(如\. 匹配.点符号)
量词:
控制字符重复次数
*
0次或多次(如a*匹配"a"、"aa"或空字符串)。
+
1次或多次(如a+匹配"a"、"aa"但不匹配空字符串)。
?
0次或1次(如a?匹配"a"或空字符串)。
{n}
精确n次(如a{3}匹配"aaa")。
{n,}
至少匹配n次
{n,m}
n到m次(如a{2,4}匹配"aa"、"aaa"或"aaaa")。
边界:
定义匹配位置
^
字符串或行开头(如``^A匹配以"A"开头的字符串)。
$
字符串或行结尾(如a$匹配以"a"结尾的字符串)。
\b
单词边界(如\bword\b匹配独立单词"word")
\B
非单词边界(如\Bword\B匹配非独立单词 word)
分组与引用
()
可匹配并捕获子表达式,所谓捕获就是将匹配的结果暂存在一个内存区,引用时从内存区获取匹配的结果
(?:)
匹配不捕获子表达式
\数字
引用数字指示的子表达式(被捕获),从1开始,如%1 表示第1个子表达式(注意:在不同编辑器中,引用的符号可能不同,例如vscode中 使用 $数字 引用子表达式)
|
表示“或”的关系(如 ab|cd,可以匹配ab或cd)
字符类
[ ]
匹配括号内的任意一个字符。存在枚举和范围两种写法,例如枚举[abc],范围[a-b] 都可以匹配字符 "a"、"b" 或 "c";
[^ ]
匹配除了括号内的字符以外的任意一个字符。例如,[^abc] 匹配除了字符 "a"、"b" 或 "c" 以外的任意字符
特殊字符类
\d
匹配任意数字,等价于 [0-9]
\D
匹配任意非数字,等价于 [^0-9]
\w
匹配任意单词字符(字母、数字、下划线),等价于 [a-zA-Z0-9_]
\W
匹配任意非单词字符,等价于 [^a-zA-Z0-9_]
\s
匹配任意空白字符,等价于[\n\r\f\t\v]
\S
匹配任意非空白字符,等价于[^\n\r\f\t\v]
非打印字符
\n 回车
\r 换行
\t 制表
\f 换页
\v 垂直制表符
注:分组和引用元字符,基于定义描述并不太好理解,不过在替换操作中它们非常有用,如果新的字符串由老字符串的一部分组成,则可以将这部分复用的字符串用()分组符进行分组,在新的字符串中用引用符‘$数字’来引用。
例如: 需要将 “abc123efg”, 替换为 “000-123-000”, 在搜索时将数字部分“123”用分组元字符进行分组,如下图所示(\d+), 在新字符串中是用$1引用“123”分组。
图2 分组(捕获)和引用
(?:)匹配但不捕获的效果,如下图所示,因为(?:\d+)只是匹配字符串“123”但是无法捕获内容,$1无可引用内容。
图3 分组(不捕获)和引用
结语
本文介绍了正则表达式的概念、组成元素和基本用法,帮助大家对正则表达式有一个初步的印象。在后续的文章中,将为大家带来正则表达式的高级用法,介绍完正则表达式的用法后,我们将介绍正则表达式在实战中的应用,届时会揭晓本文开头“setter/getter 批量设置”的实现步骤,敬请期待。
喜欢我,请关注微信公众号 “飞翔的SA”! 持续为大家带来精彩内容!