一、在 iOS 中使用正则表达式
let predicate = NSPredicate(format: "SELF MATCHES %@" ,predicateStr)
let evaluate = predicate.evaluate(with: matchingStr)
二、Online Tool
三、匹配字符
Special Symbol
以下所有字符要匹配原字符,前面加 \
Symbol | Function | Example ([RULE STRING] -> [MATCH STRING] = RESULT[TRUE OR FAlSE]) |
---|---|---|
() | 表示一个字符串组合 | |
* | 前面子表达式匹配 >= 0 | |
+ | 前面子表达式匹配 >=1 | |
. | 除换行 \n 之外的任何单字符 | |
[] | 单个匹配,定义匹配的字符范围 | |
? | 同 *,或指定一个非贪婪限定符 | |
\ | 转义字符 | |
{n} | n >= 0, 确定匹配 n 次 | |
{n, } | n >= 0, 最少匹配 n 次 | |
{n, m} | n >= 0, n <= m,最少匹配 n 且最多匹配 m 次 | |
| | 指明两项之间的一个选择 |
Location Symbol
Symbol | Function | Example ([RULE STRING] -> [MATCH STRING] = RESULT[TRUE OR FAlSE]) |
---|---|---|
^ | 字符串的开始字符位置 | |
$ | 字符串的结束字符位置 | |
\b | 单词边界匹配 | \bter -> "Chapter" = false, ter\b -> "Chapter" = true |
\B | 无单词边界匹配 | \Bte -> "Chapter" = true |
匹配特殊字符
Symbol | Function | Example (Symbol) |
---|---|---|
\d | 同 [0-9],匹配一个数字字符 | [0-9] |
\D | 同 [^0-9] 匹配一个非数字字符 | [^0-9] |
\f | 匹配一个换页符 | \f |
\n | 匹配一个换行符 | \n |
\r | 匹配一个回车符 | \r |
\S | 匹配任何空白字符 | |
\t | 匹配一个制表符 | |
\v | 匹配一个垂直制表符 | |
\w | 同 [A-Za-00-9_],匹配字母、数字、下划线 | |
\W | 同 [^A-Za-00-9_],匹配非「字母、数字、下划线」 | |
\xn | 同 [^A-Za-00-9_],匹配非「字母、数字、下划线」 | |
\W | 同 [^A-Za-00-9_],匹配非「字母、数字、下划线」 | |
\xn | 匹配 n,n 为十六进制转移值,n 为两个数字长,\x04 or \x67 | |
\num | 匹配 num,num 是一个 | |
\n | ||
\nm | ||
\nml | ||
\un | 匹配 n,其中 n 是一个用 4 个 16 进制数字表示 Unicode 字符 |
查询,但是不消耗字符,pattern 可以 使用 | 来组合各个部分
Symbol | Function | Example ([RULE STRING] -> [MATCH STRING] = RESULT[TRUE OR FAlSE]) |
---|---|---|
(?:pattern) | 匹配 pattern | industr(?:y|ies) -> industry -> true |
(?=pattern) | 正向匹配 pattern | Windows(?=95|98|2000) -> Windows2000 -> true |
(?!pattern) | 正向不匹配 pattern | Windows(?!95|98|2000) -> Windows3.1 -> true |
(?<=pattern) | 反向匹配 pattern | (?<=95|98|2000)Windows -> 2000Windows -> true |
(?<!pattern) | 反向不匹配 pattern | (?<!95|98|2000)Windows -> 3.1Windows -> true |
字符集匹配
Symbol | Function | Example ([RULE STRING] -> [MATCH STRING] = RESULT[TRUE OR FAlSE]) |
---|---|---|
(x|y) | 匹配 x or y | industr(?:y|ies) -> industry -> true |
[xyz] | 匹配 x y z | |
[^xyz] | 未包含 x y z | |
[a-z] | 匹配 a 到 z 的小写字符 | |
[^a-z] | 反向不匹配 pattern |
四、分析一下下面的正则表达式
1. Email 地址:
^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
拆分如下:
\w+
+([-+.]\w+)*
+@
+\w+
+([-.]\w+)*
+.
+\w+
+([-.]\w+)*
后面带有星号的表示可选匹配
\w+
表示[数字、字母、下划线]
其中一种类型字符串至少匹配一次
([-+.]\w+)*
表示.\w+
或+\w+
或-\w+
这样的组合匹配 >= 0 次
2. 域名:
[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
3. InternetURL:
^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
我们将上面的正则进行拆解分析,我们将上面分为四个部分:
举个🌰,可以正确匹配的字符串 http://www.baidu.com/component
第一项: http://
~~ http://第二项: ([\w-]+.)+
~~ 匹配多个类似:www.
和baidu.
可以理解为
()
中是一个组合,是一个由[数字、字母、下划线、减号]
其中一种类型字符串,且>1次匹配,和一个.
的组合。类似匹配如:w_w.
、___.
、123.
第三项: [\w-]+
~~ 匹配 com
[数字、字母、下划线、减号]
其中一种类型字符串至少匹配一次第四项: (/[\w-./?%&=]*)?
~~ 匹配 /component
/
+[数字、字母、下划线、-、.、?、%、&、=] 大于一次匹配
由于外面还加了一个
()?
说明匹配 >=0 次,字符串匹配可选
4. 手机号码:
^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
拆分如下:13[0-9]
| 14[5|7]
| 15[0|1|2|3|5|6|7|8|9]
| 18[0|1|2|3|5|6|7|8|9]
+ 8 个[数字]
5. 电话号码
"XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX
^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
6. 国内电话号码(0511-4405222、021-87888822):
\d{3}-\d{8}|\d{4}-\d{7}
7. 身份证号(15位、18位数字):
^\d{15}|\d{18}$
< 身份证号码的详细规则 >
- 前 6 位对应省市区
- 7 ~14 : 出生月日
- 15 ~ 1 7 : 顺序码
- 17 位表示性别,男性 - 奇数,女性 - 偶数
- 18 位表示校验码
< 校验码计算 >
ai —— 身份证第 i 位数字
Wi —— 身份证第 i 位对应的加权因子
i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ai | a1 | a2 | a3 | a4 | a5 | a6 | a7 | a8 | a9 | a10 | a11 | a12 | a13 | a14 | a15 | a16 | a17 |
Wi | 7 | 9 | 10 | 5 | 8 | 4 | 2 | 1 | 6 | 3 | 7 | 9 | 10 | 5 | 8 | 4 | 2 |
假设身份证第 n 位的值为 ai
image.png根据 y 的结果可以找到对应 a18 的值,校验是否与身份证号码第18位相匹配,匹配则说明身份证号码正确 ✅
y | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|---|
a18 | 1 | 0 | X | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 |
a18 有些时候为 X,代表罗马数字 10
8. 帐号是否合法:
字母开头,允许5-16字节,允许字母数字下划线
^[a-zA-Z][a-zA-Z0-9_]{4,15}$
9. 密码
以字母开头,长度在6~18之间,只能包含字母、数字和下划线
^[a-zA-Z]\w{5,17}$
10. 强密码
必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
11. 日期格式:
^\d{4}-\d{1,2}-\d{1,2}
12. 一年的12个月(01~09和1~12):
^(0?[1-9]|1[0-2])$
13. 一个月的31天(01~09和1~31):
^((0?[1-9])|((1|2)[0-9])|30|31)$
网友评论