正则表达式
又称 规则表达式,Regular Expression,常简写为regex、regexp或RE;
正则表达式是计算机科学的一个概念。
正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。(用来匹配字符串/文字)
- “正则"就是"规则”,"正则表达式"就是能够让我们表达出自己想法的规则,只要学会了这种规则,我们就能够表达自己的想法。
白话:
大家都知,command+F
可以在文本内容内搜索对应的文本;
若文本"hello"出现了三次,分别在第一行,第二行和最后一行,搜索结果被匹配了3此,搜索目的达到。
但,如果我想搜索“位于首行的文本”,不想获取到其他行的文本;也就是说,字符串不仅要是"hello",而且还要位于行首,需要同时满足这两个条件的字符串才算满足条件。如何处理?
Regular Expression可以帮助告诉计算机,只查找"位于行首的hello字符串"
————————————————————————
例如Sublime Text中有此功能的实现:
注:.*
就是Regular Expression的功能钮;通过搜索正则表达式^hello
匹配到了首行的hello
。
举几个日常见到的例子:
淘宝网注册账号,输入手机时,输入数字不满11位时,会有提示框出现“手机号码格式不正确,请重输”;
这就是系统运用正则表达式,来发现错误的典型例子。
发微博时:文本框添加表情,出现的是文本(如[难过]
),发送后却成为了GIF图片;这也是正则运用后的结果。
正则是所有编程语言都会用到的工具,语法都大同小异。及其重要。
————————————————————————
匹配任意字符: / 字符 / g
注:以下练习用✔︎
表示此行被Expression匹配到了;
建议使用在线练习网站:RegExr.com
/字
/g
匹配字符
—————————————
注意!(汉字集合下面有说到)
匹配纯汉字时可直接写汉字,如匹配“汉字”:/ 汉字 /g
;
匹配汉字集合时要写汉字的Unicode,如匹配“啦 - 啦”:/ [\u4e00 - \u9fa5] /g
;
/字 ..
/g
点代表匹配(除了断行/空行外)任意一个字符;
(亦可写成:/ 字符 ... /g
/ .. 字符 /g
,一个点代表一个字符)
————————————————————————————————
Expression:
/ 菠萝 .. /g
————————————————————————————————
Text:
菠萝油 ✔︎
菠萝果茶 ✔︎
菠什么萝
————————————————————————————————
————————————————————————————————
Expression:
/ . /g
————————————————————————————————
Text:
菠萝油 ✔︎
菠萝果茶 ✔︎
菠什么萝 ✔︎
————————————————————————————————
————————————————————————————————
Expression:
/ . /g
————————————————————————————————
Text:
若这里全为断行
NO MATCH
————————————————————————————————
————————————————————————————————
Expression:
/ .... /g
————————————————————————————————
Text:
abc 因Expression是4个点,Test内只有3个字符
NO MATCH
————————————————————————————————
————————————————————————————————
Expression:
/ 3.14 /g
————————————————————————————————
Text:
3.14 ✔︎
2.18
4.14
3-14 ✔︎ 因为“点”代表任意字符,也包括“-”
————————————————————————————————
若我们不想让“点”代表任何字符,想明确匹配“点”?
“点”前加 斜杠(转义符):\.
(注意:是delete键下方的斜杠键);
————————————————————————————————
Expression:
/ 3\.14 /g
————————————————————————————————
Text:
3.14 ✔︎
2.18
4.14
3-14 此行不再被匹配
————————————————————————————————
/\w
/g (小写 w)
匹配阿拉伯数字、英文大小写还有下划线(数字和字母以外只支持下划线);
————————————————————————————————
Expression:
/ \w /g
————————————————————————————————
Text:
1234567890 ✔︎
abcdefg ✔︎
hijklmnopqrst ✔︎
_ ✔︎
「」#¥*!@()
————————————————————————————————
/\W
/g (大写 W)
匹配被小写w排除在外的字符(\w
的补集);
————————————————————————————————
Expression:
/ \w /g
————————————————————————————————
Text:
1234567890
abcdefg
hijklmnopqrst
_
「」#¥*!@() ✔︎
————————————————————————————————
/\d
/g (小写 d)
匹配阿拉伯数字;
————————————————————————————————
Expression:
/ \d /g
————————————————————————————————
Text:
1.2345.67890 ✔︎(其中两个“点”未被匹配)
abcdefg
hijklmnopqrst
_
「」#¥*!@()
————————————————————————————————
————————————————————————————————
Expression:
/ \d\.\d /g
————————————————————————————————
Text:
1.2 ✔︎
————————————————————————————————
/\D
/g (大写d)
匹配非阿拉伯数字的字符,包括空格(\d
的补集);
————————————————————————————————
Expression:
/ \D /g
————————————————————————————————
Text:
1.2345.67890 ✔︎(只匹配到两个“点”)
ab cd efg ✔︎
hijklmnopqrst ✔︎
_ ✔︎
————————————————————————————————
/\s
/g (小写 s)
匹配所有空白字符:空格、tab、断行等;
————————————————————————————————
Expression:
/ \s /g
————————————————————————————————
Text:
1 234 67890 ✔︎(只匹配到其中的空格和tab)
abcdefg
hijklmnopqrst
_
「」#¥*!@()
————————————————————————————————
/\S
/g (大写 S)
匹配所有空白字符(空格、tab、断行等)以外的字符;
/[12345]
/g 或者 /[1 - 5]
/g
————————————————————————————————
Expression:
/ [1 - 5] /g
————————————————————————————————
Text:
ABCDEFGHIJK
aaabbbccc
1234567890 ✔︎(匹配到12345)
_
「」#¥*!@()
————————————————————————————————
/[abcdef]
/g 或者 /[a - f]
/g (集合:小写字母可匹配到 小写+大写)
————————————————————————————————
Expression:
/ [a-f] /g
————————————————————————————————
Text:
ABCDEFGHIJK ✔︎(匹配到ABCDEF)
aaabbbccc ✔︎(匹配到aaabbbccc)
1234567890
_
「」#¥*!@()
————————————————————————————————
/[ABCDEF]
/g 或者 /[A - F]
/g(集合:大写字母只可匹配到 大写)
————————————————————————————————
Expression:
/ [A-F] /g
————————————————————————————————
Text:
ABCDEFGHIJK ✔︎(匹配到ABCDEF)
aaabbbccc
1234567890
_
「」#¥*!@()
————————————————————————————————
/[\u4e00 - \u9fa5]
/g (汉字集合:\u
即 Unicode 万国码,用数字(16进制)代表文字的一项标准);
注意!
匹配纯汉字时可直接写汉字,如匹配“汉字”:/ 汉字 /g
;
匹配汉字集合时要写汉字的Unicode,如匹配“啦 - 啦”:/ [\u4e00 - \u9fa5] /g
;
其实0x4e00
代表19968
:一
;0x9fa5
代表40869
:某个很复杂的汉字
,这个区间代表Unicode中所有的汉字。(40869-19968 = 20901 记录在Unicode中的汉字有20901个)
graphemica.com Unicode 在线转换网站
————————————————————————————————
Expression:
/[\u4e00 - \u9fa5]/g
————————————————————————————————
Text:
ABCDEFGHIJK
aaabbbccc
1234567890
啦啦啦 ✔︎
—————————————————————————————————
——————————————————————————————————
重复一次或多次
此部分就像做饭过程中的调料,前部分是主食;调料也会起到重要作用。
若老板想让你在评论区匹配“yo”
评论区有正确语法的“yo”,也有“yooooooo”
如何同时匹配这些相同意思的文本?
/[字]+
/g ( 加号
置于字符/集合 后面 表示前一个字符可以出现一次或多次)
————————————————————————————————
Expression:
/ yo+ /g
————————————————————————————————
Text:
yo ✔︎
yoooo ✔︎
————————————————————————————————
如何同时匹配yo
和Yo
?(首字母小写和大写)
/[yY]o+
/g (表示y
和Y
的集合)
———————————————
如何同时匹配yo
和YO
?(全部小写和全部大写)
/[yY][oO]+
/g (表示yo
和YO
的集合)
注: 这样也可以匹配YOOOOOOOOOO
;
———————————————
不要低估用户的创造能力;
若出现yo!!!
yo!!~~~
Yo。。。。。
,如何匹配到?
[字]*
:星号
置于字符/集合后面:表示此部分可以出现0次或多次。
/[yY] [oO] + [!~\.]*
/g
(除了匹配y和Y,o和O,还跟个符号集合!
~
点
,此符号合集可以出现0次或多次)
(字符框内代表一个字符)
————————————————————————————————
Expression:
/ [yY] [oO] + [!~\.]* /g (若此式没有*号,YOOOOO行前面的3行都不能被匹配)
————————————————————————————————
Text:
yo ✔︎
yooo ✔︎
Yo ✔︎
YOOOOOOO ✔︎
yo~~~~~ ✔︎
yo.... ✔︎
yo!~... ✔︎
————————————————————————————————
[字]?
问号置于字符/集合后面:表示此部分可以出现0次或1次。
若想新增范围为yop
,同时也保留p
后的标点符号,如yop!!~~
,如何处理?
/[yY] [oO] + p?[!~\.]*
/g
————————————————————————————————
Expression:
/ [yY] [oO] + p?[!~\.]* /g (符号集合前加了个"p?":"p"可出现0次或1次)
————————————————————————————————
Text:
yo ✔︎
yooo ✔︎
Yo ✔︎
YOOOOOOO ✔︎
yo~~~~~ ✔︎
yo.... ✔︎
yo!~... ✔︎
yop ✔︎ 新增yop
YOP~~~~ ✔︎ 新增YOP~~~~
————————————————————————————————
——————————————————————————————————
指定重复范围
前面说的+
?
*
范围都太笼统,若想指定选择yooooooo
(y
后7个o
),可否实现?
{ }
:花括号
可以指定选择重复范围;
若想选择o
出现2次 - 4次的行?
/yo {2,4}
/g
————————————————————————————————
Expression:
/ yo{2,4} /g
————————————————————————————————
Text:
yo
yoo ✔︎
yooo ✔︎
yoooo ✔︎
yooooooo ✔︎ (此处只匹配到第1到第4个o,后面的o未被匹配)
————————————————————————————————
问题来了,老板看到最尾行yooooooo
只有部分被匹配,不想要这一行;
什么方法可以把这行排除在外?
最直接的方法:字符/集合后添加\b
(Boundary:产生边界)
如:/yo {2,4}\b
/g
————————————————————————————————
Expression:
/ yo{2,4}\b /g
————————————————————————————————
Text:
yo
yoo ✔︎
yooo ✔︎
yoooo ✔︎
yooooooo
————————————————————————————————