概述
正则作为一种元语言工具内置在各种编程语言中,特别适合文本处理、数据验证等领域。
其优点是代码短小表现力巨大,缺点是难于阅读难于理解几乎无法调试。
我作为一个小菜鸟,希望能够摸清正则的门路,顺利记住一些常见的正则需求而不必每次都上网求助。以下是在js实现的正则环境下。
认识字符
想要自己构造正则解决需求必先学会模仿,而模仿必先认识。
面对一串长长的正则符号,我们第一个目的是认识其中每个符号的表达意思,特别是有些符号不止一个字符要知道其是怎么组合的。
很重要一点,正则是从左往右解读的。
确定正则范围
在 / / 之间的是正则表达式,第二个/之后的是模式,
你直接第一眼看上去就是 第一个/和最后一个/ 以确定正则的范围
转义
因此如果要用 / 你必须转义,我相信你明白转义的意思即 前面加\形成表达 \/,
当然其他你需要表达的元字符都可以用 \来转义,
so,what is 元字符?
简单理解就是被用做正则表达式语法的字符,
好比html中你要 写 \< 就必须转义,只不过html转义方式是换成[实体字符](http://www.w3school.com.cn/tags/html_ref_symbols.html)罢了。
注意:\不代表都是转义字符,诸如\n等都是元字符,想要匹配\n则要\\n
模式
模式只有3种,可多用
g 表示 global全局
i 表示 ignore case 忽略大小写
m 表示 multiline 多行
gi 表示 全局忽略大小写
依次类推
很多文本工具的正则不要求你写后面的模式是因为他们一般直接默认gim
理解什么是全局g
不加g 匹配到一个就结束,加g则一直匹配到结尾
正则常用符号分类
符号的具体含义不太理解没关系,毕竟我们第一次用,且不需要记住所有符号啊,我们的目标是拿下常用的,多见几次就明白了
Anchor:匹配位置而非字符
^ 一行或一个串的起始位置
$ 一行或一个串的结束位置
\b 匹配一个字边界,即字与空格间的位置。
\B 匹配与\b相反的位置
Character class:匹配特殊字符集,预定义了一些字符集给你用,你也可以自己构造
. 匹配除了换行符之外的所有字符
\s 匹配空白符
\S 匹配非空白符
\w 相当于匹配[A-Za-z0-9_],即所有大小写字母,数字,underscore(连字符_).//注意不是-
\W 与\w正好相反
\d 数字
\D 非数字
插一句,空白符包括换页、换行、回车、制表(tab是其中一种)
范围:这个应该隶属匹配字符集的Character class,但感觉分开来讲比较好
[A-Z] 表示A到Z范围内都可以匹配,跟数学中的用法一致
[AZ] 表示A、Z都行
[^AZ] 表示既不是A也不是Z //这是^的第二种用法了,不过别担心,表示反义它必须在[]里
Escaped(转义):
简单理解就是被用做正则表达式语法的字符需要转义,但个人感觉跟多靠积累
记得js中的\uxxxx这种形式吧,这是转义某种unicode字符,具体什么字符要查表,
另外还有\000这种以八进制开头的与\xFF这种16进制的都可以表示同样的东西,
这三者能够表示所有实体符号,且能互换使用。
\cx 匹配由x指明的控制字符,x必须[A-Za-z]
比如 \cI 表示tab,等价\t
\cM 表示回车,等价\r
\cJ 表示换行,等价\n
不得不跳出来说说win与linux环境下的行尾了,CRLF即rn是在win下,而linux是LF。这也是为什么linux下写代码复制到win下换行都不见了的原因。
group and lookaround
这部分比较难,
Groups allow you to combine a sequence of tokens to operate on them together. Capture groups can be referenced by a backreference and accessed separately in the results.
Lookaround lets you match a group without including it in the result.
请再去菜鸟语法看看试着理解上面那段鸟语的意思。
(ABC) 形成一个子串再进行运算
\1 反向引用
剩下感觉用处不大
反向引用用法
Example
正则: (\w)a\1
源: hah dad bad dab gag gab
结果: hah dad gag
解释: 这个串匹配三个字符,第一个\w的意思看上面,a就是字母a,\1表示引用第一个匹配到子串;所以最终应该是 BAB这种形式,或者 abcacb这种则会把cac标红.
重复/限定符
正则运算符优先级
认识完符号和一些基本的注意点(转义、反向引用、范围、从左到右解读)后,看看
资源安利
未完待续....
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。