正则表达式(Regular Expression)是一门简单语言的语法规范,是强大、便捷、高效的文本处理工具,它应用在一些方法中,对字符串中的信息实现查找、替换和提取操作。
1. 创建正则表达式
正则表达式由 pattern(正则表达式主体) 和 flags(修饰符, 可选)两部分组成。 但是有不同的定义的方式:一种是字面量定义的方式,一种是构造函数定义的方式。
A. 概念:
- pattern: 可以是任何简单或复杂的正则表达式。 pattern中使用的所有元字符都必须转义,转义需要用转义字符,反斜杠。
- flags: 每个正则表达式都可带有一或多个标志(flags),用以标明正则表达式的行为。 包括三个匹配模式:
g (全局模式), i (不区分大小写模式), m (多行模式)
B. 定义:
- 字面量: 正则表达式包含在一对斜杠(/)之间的字符,
如果需要使用特殊字符,就需要使用一个反斜杠,\[ 代表的就是 [
。
var testReg = /pattern(正则表达式主体)/flags(修饰符, 可选)
var testReg = /\[bc\]at/i; //查找不区分大小写的[bc]at
- 构造函数: 通过 RegExp() 构造函数来定义。使用构造函数定义,有两个参数,这两个参数都是字符串。字符串中,任何字符加反斜杠则表示字符本身,
所以如果要使用特殊字符,就需要使用两个反斜杠, \\[ 代表的就是 [
var testReg = new RegExp('pattern(正则表达式主体)', 'flags(修饰符, 可选)')
var testReg = new RegExp('\\[bc\\]at', 'i') // 查找不区分大小写的[bc]at,但是 \ 要进行转义,所以是\\
2. 正则表达式的符号意义
A. 特殊含义的字符匹配
-
^
-- 匹配输入的开始
'Abc'.match(/^A/); // 'A'
-
$
-- 匹配输入的结束
eateat'.match(/t$/); //'t'
-
.
-- 匹配除换行符之外的任何单个字符,查找单个字符,除了换行和行结束符
"nay, there is no any apple on the tree".match(/.n/); //
-
\w
-- 查找单词字符
'ad12~@@!wg'.match(/\w/g); //["a", "d", "1", "2", "w", "g"]
-
\W
-- 查找非单词字符
'ad12~@@!wg'.match(/\W/g); //["~", "@", "@", "!"]
-
\d
-- 查找数字
'ad12~@@!wg'.match(/\d/g); //["1", "2"]
-
\D
-- 查找非数字字符
'ad12~@@!wg'.match(/\D/g); //["a", "d", "~", "@", "@", "!", "w", "g"]
-
\s
-- 查找空白字符
'abceee efg'.match(/e\s/g); //["e "]
-
\S
-- 查找非空白字符
'abceee efg'.match(/\S/g); //["a", "b", "c", "e", "e", "e", "e", "f", "g"]
-
\b
-- 匹配单词边界
'abcde@(2020 f7.g2!9'.match(/\b(\w+)/g); //["abcde", "2020", "f7", "g2", "9"]
-
\B
-- 匹配非单词边界
'abcde@(2020 f7.g2!9'.match(/\b(\w+)/g); //["bcde", "020", "7", "2"]
-
\n
-- 查找换行符
'abcd\nef'.match(/\n/).index; //4
-
\f
-- 查找换页符
'abcd\fef'.match(/\f/).index; //4
-
\r
-- 查找回车符 -
\t
-- 查找制表符 -
\v
-- 查找垂直制表符
B. 字符范围匹配
在正则表达式语法中,方括号表示字符的范围。在方括号中可以包含多个字符,表示匹配其中任意一个字符。如果多个字符的编码顺序是连续的,可以仅指定开头和结尾字符,省略中间字符,仅使用连字符~表示。如果在方括号内添加脱字符^前缀,还可以表示范围之外的字符。
-
[abc]
-- 查找方括号中任意一个字符
"abbccee".match(/[abc]/g); //["a", "b", "b", "c", "c"]
-
[^abc]
-- 查找不在方括号内的字符
"abbccee".match(/[abc]/g); //["e", "e"]
-
[0-9]
-- 查找从 0 至 9 范围内的数字,即查找数字
"a12bc@89!".match(/[0-9]/g); // ["1", "2", "8", "9"]
-
[a-z]
-- 查找从小写 a 到小写 z 范围内的字符,即查找小写字母
"a12bc@89!".match(/[a-z]/g); ["a", "b", "c"]
-
[A-Z]
-- 查找从大写 A 到大写 Z 范围内的字符,即查找大写字母
"A12bc@89!".match(/[A-Z]/g); // ["A"]
-
[A-z]
| -- 查找从大写 A 到小写 z 范围内的字符,即所有大小写的字母
"A12bc@89!".match(/[A-z]/g); //["A", "b", "c"]
C. 重复类量词匹配
重复类量词总是出现在它们所作用的字符或子表达式后面。如果想作用于多个字符,需要使用小括号把它们包裹在一起形成一个子表达式。
-
*
-- 匹配前一个表达式0次或多次,等价于 {0,}
"A ghost boooooed".match(/bo*/); // 'booooo'
"A ghost b".match(/bo*/); // 'b'
-
+
-- 匹配前面一个表达式1次或者多次。等价于 {1,}
"candy".match(/a+/); // 'a'
"caaaaaaandy".match(/a+/); // 'aaaaaaa'
-
?
-- 匹配前面一个表达式0次或者1次。等价于 {0,1}
"angel".match(/e?le?/); //'el'
-
n{x}
-- 匹配包含 x 个 n 的序列的字符串 -
n{x,y}
-- 匹配包含最少 x 个、最多 y 个 n 的序列的字符串 -
n{x,}
-- 匹配包含至少 x 个 n 的序列的字符串
var s = "ggle gogle google gooogle goooogle gooooogle goooooogle gooooooogle goooooooogle";
s.match(/go{2}gle/g); //["google"]
s.match(/go{3,5}gle/g); //["gooogle", "goooogle", "gooooogle"]
s.match(/go{6,}gle/g); //["goooooogle", "gooooooogle", "goooooooogle"]
2. 常用的正则表达式
验证Email地址: ^\w+[-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
验证身份证号(15位或18位数字): ^\d{15}|\d{}18$
中国大陆手机号码: 1\d{10}
中国大陆固定电话号码: (\d{4}-|\d{3}-)?(\d{8}|\d{7})
中国大陆邮政编码: [1-9]\d{5}
IP地址: ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
日期(年-月-日): (\d{4}|\d{2})-((1[0-2])|(0?[1-9]))-(([12][0-9])|(3[01])|(0?[1-9]))
日期(月/日/年): ((1[0-2])|(0?[1-9]))/(([12][0-9])|(3[01])|(0?[1-9]))/(\d{4}|\d{2})