正则表达式的妙用(一) 初识正则——基础用法

0 阅读1分钟

引言

作为一名面向对象开发人员,相信大家一定遇到过给类的私有成员变量写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”!  持续为大家带来精彩内容!