1. 基础概念
正则表达式(Regular Expression),又称规则表达式,是一种文本模式,通常用来检索、替换和控制文本。学习正则表达式,实际上是在学习一种十分灵活的逻辑思维。
2. 核心语法
常用字符:
| 符号 | 说明 | 示例 |
|---|---|---|
. | 匹配任意单个字符 | a.c → "abc"、"a#c" |
* | 前边元素出现0次或多次 | ab*c → "ac"、"abbc" |
+ | 前边元素出现1次或多次 | ab+c → "abc"、"abbc" |
? | 前边元素出现0或1次 |
将匹配单个" |
{n} | 精确匹配n次 | a{2} → "aa" |
{n,} | 匹配至少出现n次 | /a{2,}/ 匹配 "aa", "aaaa" 和 "aaaaa" 但是不匹配 "a"。 |
{n,m} | 匹配至少 n 次,最多 m 次 | /a{1, 3}/ 并不匹配“cndy”中的任意字符,匹配“candy” 中的 a,也匹配“caaaaaaandy”中的前三个 a。 |
[ ] | 匹配在 [ ] 里面的任意字符 | [abc] 匹配 a、b 或 c 中的任意字符 |
[^ ] | 匹配不在 [ ] 里面的任意字符 | [^abc] 匹配除 a、b、c 之外的字符;“[^a-z]"不匹配字母 |
( ) | 捕获分组 | (ab)+ → "abab" |
| x|y | 匹配x或y | “z|food"能匹配"z"或"food"。"(z|f)ood"则匹配"zood"或"food"。 |
| \ | 转义字符,匹配特殊符号 | "\[" 匹配 "[", "\*" 匹配 "*" |
| \d | 匹配数字,等价于 [0-9] | |
| \w | 匹配单词字符 ,等价于 [A-Za-z0-9] | |
| \s\S | 匹配所有 | |
| ^ | 匹配字符串开头 | |
| $ | 匹配字符串结尾 |
3. 典型场景
邮箱验证:
^[\w.-]+@[\w-]+\.[a-zA-Z]{2,4}$
分解说明:
^开始[\w.-]+用户名(字母/数字/._-)@固定符号[\w-]+域名主体\.转义点号[a-zA-Z]{2,4}$2-4位字母的顶级域名
匹配日期(YYYY-MM-DD):
^\d{4}-\d{2}-\d{2}$
4.Cadence skill:模式匹配函数
rexMatchp: 匹配字符串或符号列表
rexMatchp("[0-9]*[.][0-9]+" ".001") =>t
rexMatchp("[0-9]*[.][0-9]+" ".") =>nil
rexMatchp("fet+" "nfet_") =>t
rexReplace:替换子字符串
rexCompile( "[0-9]+" ) => t
rexReplace( "abc-123-xyz-890-wuv" "(*)" 1)
=> "abc-(*)-xyz-890-wuv"
rexReplace( "abc-123-xyz-890-wuv" "(*)" 2)
=> "abc-123-xyz-(*)-wuv"
rexReplace( "abc-123-xyz-890-wuv" "(*)" 3)
=> "abc-123-xyz-890-wuv"
rexReplace( "abc-123-xyz-890-wuv" "(*)" 0)
=> "abc-(*)-xyz-(*)-wuv"
rexCompile( "^test" ) => t
rexReplace( "test_a" "bb" 0) => "bb_a"
rexReplace( "test_a" "[&]" 0) => "[tets]_a"
; < >替换为[ ]
pin="a<00>0"
rexCompile("<") => t
a=rexReplace(pin "[" 0) => "a[00>0"
rexCompile(">") => t
b=rexReplace(a "]" 0) => "a[00]0"
5.常用正则表达式
| 用户名 | /^[a-z0-9_-]{3,16}$/ |
|---|---|
| 密码 | /^[a-z0-9_-]{6,18}$/ |
| 密码2 | (?=^.{8,}$)(?=.*\d)(?=.*\W+)(?=.*[A-Z])(?=.*[a-z])(?!.*\n).*$ (由数字/大写字母/小写字母/标点符号组成,四种都必有,8位以上) |
| 十六进制值 | /^#?([a-f0-9]{6}|[a-f0-9]{3})$/ |
| 电子邮箱 | /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/ /^[a-z\d]+(\.[a-z\d]+)*@([\da-z](-[\da-z])?)+(\.{1,2}[a-z]+)+$/或\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* |
| URL | /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/ 或 [a-zA-z]+://[^\s]* |
| IP 地址 | /((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)/ /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/ 或 ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) |
| HTML 标签 | /^<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)$/或<(.*)(.*)>.*<\/\1>|<(.*) \/> |
| 删除代码\\注释 | (?<!http:|\S)//.*$ |
| 匹配双字节字符(包括汉字在内) | [^\x00-\xff] |
| 汉字(字符) | [\u4e00-\u9fa5] |
| Unicode编码中的汉字范围 | /^[\u2E80-\u9FFF]+$/ |
| 中文及全角标点符号(字符) | [\u3000-\u301e\ufe10-\ufe19\ufe30-\ufe44\ufe50-\ufe6b\uff01-\uffee] |
| 日期(年-月-日) | (\d{4}|\d{2})-((0?([1-9]))|(1[1|2]))-((0?[1-9])|([12]([1-9]))|(3[0|1])) |
| 日期(月/日/年) | ((0?[1-9]{1})|(1[1|2]))/(0?[1-9]|([12][1-9])|(3[0|1]))/(\d{4}|\d{2}) |
| 时间(小时:分钟, 24小时制) | ((1|0?)[0-9]|2[0-3]):([0-5][0-9]) |
| 中国大陆固定电话号码 | (\d{4}-|\d{3}-)?(\d{8}|\d{7}) |
| 中国大陆手机号码 | 1\d{10} |
| 中国大陆邮政编码 | [1-9]\d{5} |
| 中国大陆身份证号(15位或18位) | \d{15}(\d\d[0-9xX])? |
| 非负整数(正整数或零) | \d+ |
| 正整数 | [0-9]*[1-9][0-9]* |
| 负整数 | -[0-9]*[1-9][0-9]* |
| 整数 | -?\d+ |
| 小数 | (-?\d+)(\.\d+)? |
| 空白行 | \n\s*\r 或者 \n\n(editplus) 或者 ^[\s\S ]*\n |
| QQ号码 | [1-9]\d{4,} |
| 不包含abc的单词 | \b((?!abc)\w)+\b |
| 匹配首尾空白字符 | ^\s*|\s*$ |
6.参考资料
正则表达式 – 语法 | 菜鸟教程
https://www.runoob.com/regexp/regexp-syntax.html



7946

被折叠的 条评论
为什么被折叠?



