看了经典的30分钟入门正则表达式,有了这篇笔记。
像任何一门自然语言,正则表达式有他自己的元音字母——元字符,必须牢牢的记住每一个原字符的含义才能流畅看正则表达式。否则一遇到就查表是浪费时间且痛苦的。
常用的原字符:
. 点号。一个点号可以代表除了换行符以外的任何字符。 ^ 匹配接受匹配的字符串的开始。只匹配一个位置 $ 匹配接受匹配的字符串的结束。只匹配一个位置 b boundary 它可以匹配 单词的边界。可以是单词开头或者结尾,单词往往使用空格和标点符号作为分界,但是b只匹配一个位置,不匹配字符。 d digit 匹配一个数字。 w word 匹配字母数字下划线,汉字。 s split 匹配空格,tab,换行符,全角的空格等等。 如果需要匹配元字符本身,那么在写表达式的时候必须在元字符前加上反斜杠。告诉程序取消原字符的特殊意义。
如果要匹配一连串同类型的数据,可以使用重复语法来写正则表达式。
* 星号。 一个星号代表重复前边的内容任意次。 + 加号。 加号和星号类似,但是重复次数是1到无穷大。 ? 问号。重复一次或者零次。 {n} 花括号,重复n次。 {n,} 重复n次以上。 {n,m} 重复n,到m次
如果,一个位置只需要在少部分字符中进行选择的话。我们可以自定义一个集合进行匹配。我们使用方括号来列出集合元素。扩号中有些原字符就变意思了,比如^。
[] 代表是一个小集合 [0-9] 匹配数字 [a-zA-Z] 匹配字母
如果我们需要在一个表达式中写多个规则,那么可以使用到分支条件 | 来分开规则| | 管道符号,代表前面和后面分别是不同的规则,当不满足前面的规则时,继续匹配。 所以能匹配较多的规则应该放在前面,否则容易出错。
如果需要重复多个字符,我们需要在总表达式中写子表达式。这时候我们使用()小括号来分组。 () 小括号,可以把正则表达式当成一组来使用。用法比较多。
比较简单,就是反义元字符。 W 匹配任意不是字符数字下划线,汉字的字符。 S 匹配任意不是空白字符的字符(分割字符) D 匹配任意非数字的字符。 B 匹配不是单词开头或者结尾的字符。 [^x] 匹配除了x的以外的任意字符。 [^aeiou] 匹配除了aeiou以外的字符。
使用小括号指定一个子表达式,匹配这个表达式的文本可以在表达式或者其他程序中做进一部处理。默认情况,分组从左到右分配组号,1,2,3................ 注意:分组0对应整个表达式;分配过程有两次,第一遍给未命名的组分配,第二次给命名组分配,所以命名组组号大雨未命名组;(?:exp) 该组不分配组号。exp指表达式。后向引用可以重复搜索前面分组匹配到的单词。反斜杠后面跟组号 ,1,就能引用。 也可以指定组名。语法为(?<word>exp),或者(?‘word’exp)这样组名就指定为word。引用的话就可以使用k<word>。 (exp) 匹配exp,自动命名 (?<word>exp),(?'word'exp) 匹配exp,组名word (?:exp) 匹配exp,不捕获文本。
第一次看到这个名字,就醉了。什么鬼啊。先看看有哪些鬼。 (?=exp) 匹配exp前面的位置,以exp结尾不带exp的部分 (?<=exp) 匹配exp后面的位置,以exp开头不带exp的部分 (?!exp) 匹配后面跟的不是exp的位置,后面不是exp得都行 (?<!exp) 匹配前面不是exp的位置。前面不是exp的都行。 太反人类了,以后用到在研究。
(?#这个就是注释,我就不多写了)
这小结比较重要。因为常用。默认情况下匹配重复的时候正则表达式会尽可能匹配最多个字符。这就是贪婪。 那么懒惰就是在重复符后面加个?问号 *? 重复任意次尽可能少 +? 重复一到任意次尽可能少 ?? ~~~~~~脑补~~~~~~~~ {n,m}? ~~~~~~脑补~~~~~~ {n,}? ~~~~~~脑布~~~~~~
Ignorecase 忽略大小写 Multiline 多行,改变&和^的意思 Singleline 单行,更改.的意思,使它和每一个字符匹配 IgnorePatternWhitespace 忽略表达式中的非转义空白并启用#标记的注释,看不懂 ExplicitCapture 仅捕获已经被显示命名的组。
代码/语法 |
说明 |
a |
报警字符(打印它的效果是电脑嘀一声) |
b |
通常是单词分界位置,但如果在字符类里使用代表退格 |
t |
制表符,Tab |
r |
回车 |
v |
竖向制表符 |
f |
换页符 |
n |
换行符 |
e |
Escape |
| |