正则表达式学习
正则表达式是由普通字符以及特殊字符(元字符)组成的文字模式,是记录文本规则的代码。
元字符
. :匹配任何单个字符
* :指定*前边的内容可以重复使用任意次以使整个表达式得到匹配
[] :匹配括号中的任何一个字符
\w :匹配字母、或数字、或下划线、或汉字
\s :匹配任意空白字符,包括空格、制表符(tab)、换行符、中文全角空空格等
\d :匹配数字
\b :匹配单词的开始或结束
^ : 匹配字符串的开始
$ : 匹配字符串的结束
例如:
比如一个网站如果要求你填写的QQ号必须为5位到12位数字时,可以使用:^\d{5,12}$
字符转义
如果要找元字符本身,可以使用 \ 来取消这些字符的特殊意义
重复--限定符
* :重复零次或更多次
+ :重复一次或更多次
? :重复零次或一次
{n} :重复n次
{n,} :重复n次或更多次
{n,m} :重复n到m次
分枝条件
分枝条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法时用 | 把不同规则分隔开
如:0\d{2}-\d{8}|0\d{3}-\d{7}这个表达式能匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445)
反义
有时候需要查找不属于某个能简单定义的字符类的字符,比如想查找除数字之外的任意字符,这时需要用到反义
\W :匹配任意不是字母、数字、下划线、汉字的字符
\S :匹配任意不是空白符的字符
\D :匹配任意非数字的字符
\B :匹配不是单词开头或结束的位置
[^x] :匹配除了x以外的任意字符
[^auieo] :匹配除了auieo以外的任意字符
后向引用
使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。
其实,组号分配还不像我刚说得那么简单:
- 分组0对应整个正则表达式
- 实际上组号分配过程是要从左向右扫描两遍的:第一遍只给未命名组分配,第二遍只给命名组分配--因此所有命名组的组号都大于未命名的组号
- 可以使用(?:exp)这样的语法来剥夺一个分组对组号分配的参与权.
后向引用用于重复搜索前面某个分组匹配的文本。例如,\1代表分组1匹配的文本。难以理解?请看示例:
\b(\w+)\b\s+\1\b可以用来匹配重复的单词,像go go, 或者kitty kitty。这个表达式首先是一个单词,也就是单词开始处和结束处之间的多于一个的字母或数字(\b(\w+)\b),这个单词会被捕获到编号为1的分组中,然后是1个或几个空白符(\s+),最后是分组1中捕获的内容(也就是前面匹配的那个单词)(\1)。
贪婪模式与非贪婪模式
贪婪:尽可能的向后匹配
非贪婪:在+、.之后加?就变为非贪婪模式,然其后的匹配模式尽早的匹配