正则表达式学习(1)
Some people, when confronted with a problem, think “I know, I’ll use regular expressions.” Now they have two problems.(如果你有一个问题,你想到可以用正则来解决,那么你有两个问题了)
正则表达式的功能
- 校验数据的有效性(比如手机号,邮箱的格式);
- 查找符合要求的文本;
- 对文本进行切割,替换等操作(比如用连续的空白符切割)
元字符
即在正则表达式中具有特殊意义的专用字符
- 特殊单字符
- .任意字符
- \d 任意数字 \D 任意非数字
- \w 任意字母数字下划线 \W 任意非字母数字下划线
- \s 任意空白符 \S 任意非空白符
- 空白符
- \r 回车符
- \n 换页符
- \t 制表符
- \v 垂直制表符
- \s 任意空白符
- 量词
- * 0到多次
- + 1到多次
- ? 0到1次
- {m} 出现m次
- {m,} 出现至少m次
- {m,n} m到n次
- 范围
- | 或,如ab|bc表示ab或者bc
- […] 多选1,括号中任意单个元素
- [a-z] 匹配a到z之间任意单个元素(包含a,z)
- [^…] 取反,不能是括号中的任意单个元素
贪婪、非贪婪与独占模式
- 贪婪匹配
尽可能进行最长的匹配(默认是贪婪的) - 非贪婪匹配
- 尽可能进行最短匹配
- 在量词后面加
?
就可以把贪婪模式变成非贪婪模式
- 独占模式
- 贪婪模式和非贪婪模式都要进行
回溯
- 独占模式也会尽可能进行多的匹配,但是匹配失败就结束,不会
回溯
- 在量词后面加
+
就可以吧贪婪模式变成独占模式 - 独占模式因为不进行回溯,所以性能更好
- 贪婪模式和非贪婪模式都要进行
分组与引用
-
分组于编号
()
在正则中表示分组- 第几个括号就是第几个分组
\d{11}(\d{3})?
- 在括号里面使用
?:
表示不保存子组(可以提高性能)
\d{11}(?:\d{3})?
-
分组引用在查找中使用
/(\w+)/\1
找连续重复出现的单词 ((\w+)
代表分组,此时只有一个分组,\1
代表第一个分组的内容.于是,该正则意思是:某单词+空格+某单词
,这样就实现了连续重复单词的匹配)
匹配模式
- 不区分大小写模式(Case-Insensitive)
(?i) 例:/(?i)cat/
- js写法
/regx/i
- js写法
- 点号通配模式
让.
匹配包括换行符号的任意字符,使用(?s)
- js 不支持
- 多行模式
使^
和$
能匹配上每行的开头或结尾,使用(?m)
- 注释模式
正则表达式的注释,使用(?#)