前言
在日常的开发中,我们常常需要对一些字符串进行验证,例如验证玩家创角的密码是否包含字母、数字、特殊符号,输入的手机号、身份证号码是否正确等等。如果利用遍历字符串的每个字符,来判断是否符合我们想要的条件话,可能需要写一长串繁琐的逻辑代码。但是若使用正则表达式则可以很简单的通过一串特殊定义的字符串来实现我们对字符串的逻辑判断。
假设我们要验证用户注册的密码,有下列条件:
- 长度6-9位
- 必须包含数字,字母,特殊符号
- 特殊符号只包含@_&三种
如果用传统的方法判断,可能就是先验证长度,然后遍历每个字符,找到数字,字母,特殊符号的时候分别做一个标记,若有字符不匹配则直接返回false。遍历结束对应的标记都有的话就返回true。
接下来我们看看用正则表达式的话,怎么来解决这个问题:
Regex pwdRegex = new Regex("^(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[@_&])[a-zA-Z0-9@_&]{6,9}$");
string pwdString1 = "Q1234567"; //False
string pwdString2 = "qw23@"; //False
string pwdString3 = "qw1REs@2"; //True
string pwdString4 = "qWE@123@33"; //False
string pwdString5 = "qWE#3@3"; //False
Debug.Log($"pwdString1:{pwdString1} isMatch:{pwdRegex.IsMatch(pwdString1)}");
......
只需要一个表达式"^(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[@_&])[a-zA-Z0-9@_&]{6,9}$"以及Regex类便实现了我们需要的验证。除此以外,我们还可以通过正则表达式来实现替换文本,或者提取子字符串的功能。
这个表达式看着挺复杂的?那就让我们先来了解下正则表达式最基础的构造吧。
菜鸟教程:https://www.runoob.com/regexp/regexp-syntax.html
在线工具:http://c.runoob.com/front-end/854
正则表达式
正则表达式是由普通字符(例如字符 abcd 0123等)以及特殊字符(称为"元字符",例如 [] () 等)组成的文字模式,描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。一般的格式如下:
/pattern/flags
其中pattern即代表我们的正则表达式,左右由两个 / 包围,而后面的flags我们称之为修饰符,可以定义一些匹配策略,例如,是否忽略大小写,是否全局查找等。
普通字符
普通字符包括除了元字符外的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。
我们先从一些简单的例子来了解正则表达式,假设我们有一段字符串如下:
<div>apple: iphone8 iphoneX iphone12</div>
如果我们要从中找出所有iphone的单词,那么我们的正则表达式可以如下:
/iphone/g
其中iphone就是我们的普通字符组成的正则表达式,代表着从字符串中搜索和其相同的子串。而g则是我们的修饰符,代表搜索所有的匹配项。因此这个通过这个正则表达式,我们可搜索到字符串中的三个iphone子串。
非打印字符
例如我们所知道的换行符\n,制表符\t都属于非打印字符串,具体种类如下:
\cx | 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符 |
\f | 匹配一个换页符。等价于 \x0c 和 \cL |
\n | 匹配一个换行符。等价于 \x0a 和 \cJ |
\r | 匹配一个回车符。等价于 \x0d 和 \cM |
\t | 匹配一个制表符。等价于 \x09 和 \cI |
\v | 匹配一个垂直制表符。等价于 \x0b 和 \cK |
\s | 匹配任何非打印(空白)字符,包括空格、制表符、换页符等等。等价于 [\f\n\r\t\v]。注意 Unicode 正则表达式会匹配全角空格符 |
\S | 匹配任何打印(非空白)字符。等价于 [^ \f\n\r\t\v] |
例如我们有下列字符串:
qwe
123
12e
rre
当我们使用下面正则的时候,一共可以搜索到到2个匹配项,因为前三行的行末都有我们看不见的回车符,也就是非打印字符\n。
/e\n/g
元字符
除了普通字符外,还有很多具有特殊意义的字符,我们称之为元字符。具体类别如下:
. | 匹配除换行符 \n 和 \r 之外的任何单个字符。若要匹配包括 \n 在内的任何字符,可以使用 (.|\n) |
| | 匹配 x 或 y。例如,z|food 能匹配 z 或 food。(z|f)ood 则匹配 zood 或 food |
[] | 字符集合。匹配所包含 |