正则表达式入门
根据使用环境的不同,有的时候正则表达式需要"/\d*/",有的时候不需要,直接"\d*",使用的时候还需要根据环境来
常用正则关键符号:
元字符 |
|
. |
匹配除了换行符以外的任意字符 |
\w |
word 匹配字母或数字或下划线或汉字等 |
\s |
space 匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等 |
\d |
digital 表示数字 |
\b |
break 单词分割符,匹配一个位置 |
^ |
字符串的开始 |
$ |
字符串的结尾 |
\ |
去除元字符的含义 |
重复 |
|
{2} |
前面连续重复出现的次数2次 |
{5,12} |
前面连续重复出现5-12次 |
{5,} |
重复5次或者更多次 |
* |
0次或者多次,它指定*前边的内容可以连续重复使用任意次以使整个表达式得到匹配 |
+ |
则匹配重复1次或更多次。{1,} |
? |
重复0次或者1次 |
|
|
字符类,[]限定范围内的字符 |
|
[aeiou] |
就匹配任何一个英文元音字母 |
[.?!] |
匹配标点符号(.或?或!) |
[a-z0-9A-Z_] |
也完全等同于\w(如果只考虑英文的话) |
分枝条件, |或 |
|
0\d{2}-\d{8}|0\d{3}-\d{7} |
一种是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445)。 |
分组,重复多个字符(abc){2} 括号里面为一组 |
|
(\d{1,3}\.){3}\d{1,3} |
简单的IP地址匹配表达式 |
((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) |
正确的分组ip匹配 |
反义,大写元字符,[^xxx] |
|
\W |
匹配任意不是字母,数字,下划线,汉字的字符 |
\S |
匹配任意不是空白符的字符 |
\D |
匹配任意非数字的字符 |
\B |
匹配不是单词开头或结束的位置 |
[^x] |
匹配除了x以外的任意字符,这里的^和字符串起始复用了 |
[^aeiou] |
匹配除了aeiou这几个字母以外的任意字符 |
后向引用,其他见表4 |
|
\1 |
代表分组1匹配的文本 |
\b(\w+)\b\s+\1\b |
用来匹配重复的单词,像go go, 或者kitty kitty。 |
\b(?<Word>\w+)\b\s+\k<Word>\b |
用来匹配重复的单词,像go go, 或者kitty kitty。 |
贪婪与懒惰原则
通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。
加上?后,就尽可能的少
表5.懒惰限定符 |
|
代码/语法 |
说明 |
*? |
重复任意次,但尽可能少重复 |
+? |
重复1次或更多次,但尽可能少重复 |
?? |
重复0次或1次,但尽可能少重复 |
{n,m}? |
重复n到m次,但尽可能少重复 |
{n,}? |
重复n次以上,但尽可能少重复 |
分组语法:分组命令、断言、注释
表4.常用分组语法 |
||
分类 |
代码/语法 |
说明 |
捕获 |
(exp) |
匹配exp,并捕获文本到自动命名的组里 |
(?<name>exp) |
匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp) |
|
(?:exp) |
匹配exp,不捕获匹配的文本,也不给此分组分配组号 |
|
零宽断言 |
(?=exp) |
匹配exp前面的位置 |
(?<=exp) |
匹配exp后面的位置 |
|
(?!exp) |
匹配后面跟的不是exp的位置 |
|
(?<!exp) |
匹配前面不是exp的位置 |
|
注释 |
(?#comment) |
这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读 |
处理选项:不同的编程语言、工具开启模式的方法可能不一样,需要关注的时候谷歌下
忽略大小写
多行模式
单行模式
忽略空白
显示部门
vim magic
(\m):除了 $ . * ^ 之外其他元字符都要加反斜杠。 默认设置nomagic
(\M):除了 $ ^ 之外其他元字符都要加反斜杠。
这个设置也可以在正则表达式中通过 \m \M 开关临时切换。 \m 后面的正则表达式会按照 magic 处理,\M 后面的正则表达式按照 nomagic 处理, 而忽略实际的magic设置。
参考文档
http://deerchao.net/tutorials/regex/regex.htm