正则表达式入门笔记


这是主要参考文献:正则表达式入门,本文只是做了修改以便于自己记忆。


1. 元字符 metacharater

\b 代表着单词的开头或者结尾,也就是单词的分界处;

. 匹配除了换行符以外的任意字符;

\d 匹配一位数字;

\s 匹配任意的空白符,包括空格,制表符,换行符,中文全角空格等;

\w 匹配字母或数字或下划线或者汉字等;

^ 匹配字符串的开始;

$ 匹配字符串的结束;


字符转义仍然是使用\


2. 限定

+ 指定前面的内容可以连续重复1次或者更多次;

* 指定前面的内容可以连续重复任意次(包括0次);

? 重复零次或者一次;

{n} 重复n次;

{n,1} 重复n次或者更多次;

{n,m} 重复n次到m次;


3. 字符类

可以利用方括号来匹配所需字符,[acb]代表可以匹配abc其中的一个,所以[]只用来匹配没有元字符对应的字符集中的单个字符

比如[0-9],就跟\d是完全一致的,也就是匹配单个数字


4.分支条件

正则表达式分支条件示例:\d{5}-\d{4}|\d{5}

这个例子含有一个小的tricky的地方,就是它说明了一个问题:
用分支条件时,要注意各个条件的顺序。如果把这个表达式改为\d{5}|\d{5}-\d{4}
那么就只会匹配五位的邮编以及9位邮编的前5位。

原因是匹配分支条件时,将会从左到右地测试每个条件,如果满足了某个分支的话,就不会再管其它条件。


5. 分组

上面所说的都是重复单个字符的方法,如果想要重复多个字符可以用小括号来指定子表达式(也叫作分组),这也是当我们需要(字符本身时需要对其进行转义的原因。

(\d{1,3}.){3}\d{1,3}是一个简单的IP地址匹配表达式。要理解这个表达式,请按下列顺序分析它:\d{1,3}匹配1到3位的数字,(\d{1,3}.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(\d{1,3})。


6.反义

代码语法 说明
\W 匹配任意不是字母、数字、下划线、汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符

7.后向引用

使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或者其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左到右,以分组的左括号为标志,第一个出现的分组组号为1,第二个为2,以此类推。

分组0对应整个正则表达式;

实际上组号分配过程是要从左到右扫描两遍:第一遍只给未命名组分配,第二遍只给命名组分配–因此所有的命名组的组号都大于未命名组的组号;

你可以使用(?:exp)这样的语法来剥夺一个分组对组号分配的参与权。

\b(\w+)\b\s+\1\b可以用来匹配重复的单词,像go go, 或者kitty kitty。这个表达式首先是一个单词,也就是单词开始处和结束处之间的多于一个的字母或数字(\b(\w+)\b),这个单词会被捕获到编号为1的分组中,然后是1个或几个空白符(\s+),最后是分组1中捕获的内容(也就是前面匹配的那个单词)(\1)。

你也可以自己指定子表达式的组名。要指定一个子表达式的组名,请使用这样的语法:(?\w+)(或者把尖括号换成’也行:(?’Word’\w+)),这样就把\w+的组名指定为Word了。要反向引用这个分组捕获的内容,你可以使用\k,所以上一个例子也可以写成这样:\b(?\w+)\b\s+\k\b。

常用分组语法:

待补充


8. 零宽断言

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器