正则表达式入门笔记
这是主要参考文献:正则表达式入门,本文只是做了修改以便于自己记忆。
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。
常用分组语法: