正则表达式学习笔记

来源:互联网 发布:类似商务通的软件 编辑:程序博客网 时间:2024/06/05 06:18
     看了经典的30分钟入门正则表达式,有了这篇笔记。
  • 0x1  元字符

        像任何一门自然语言,正则表达式有他自己的元音字母——元字符,必须牢牢的记住每一个原字符的含义才能流畅看正则表达式。否则一遇到就查表是浪费时间且痛苦的。

常用的原字符:

.    点号。一个点号可以代表除了换行符以外的任何字符。
^    匹配接受匹配的字符串的开始。只匹配一个位置
$   匹配接受匹配的字符串的结束。只匹配一个位置
\b  boundary   它可以匹配 单词的边界。可以是单词开头或者结尾,单词往往使用空格和标点符号作为分界,但是\b只匹配一个位置,不匹配字符。
\d  digit       匹配一个数字。
\w  word     匹配字母数字下划线,汉字。
\s   split      匹配空格,tab,换行符,全角的空格等等。
如果需要匹配元字符本身,那么在写表达式的时候必须在元字符前加上\反斜杠。告诉程序取消原字符的特殊意义。

  • 0x2  重复

如果要匹配一连串同类型的数据,可以使用重复语法来写正则表达式。

*    星号。 一个星号代表重复前边的内容任意次。
+   加号。 加号和星号类似,但是重复次数是1到无穷大。
?  问号。重复一次或者零次。
{n} 花括号,重复n次。
{n,} 重复n次以上。
{n,m}        重复n,到m次

  • 0x3  自定义集合

如果,一个位置只需要在少部分字符中进行选择的话。我们可以自定义一个集合进行匹配。我们使用方括号来列出集合元素。扩号中有些原字符就变意思了,比如^。

[]        代表是一个小集合
[0-9]           匹配数字
[a-zA-Z]     匹配字母

  • 0x4  分支条件

如果我们需要在一个表达式中写多个规则,那么可以使用到分支条件 |  来分开规则|
|   管道符号,代表前面和后面分别是不同的规则,当不满足前面的规则时,继续匹配。
所以能匹配较多的规则应该放在前面,否则容易出错。

  • 0x5 分组(子表达式)

如果需要重复多个字符,我们需要在总表达式中写子表达式。这时候我们使用()小括号来分组。
()   小括号,可以把正则表达式当成一组来使用。用法比较多。

  • 0x6  反义

比较简单,就是反义元字符。
\W   匹配任意不是字符数字下划线,汉字的字符。
\S    匹配任意不是空白字符的字符(分割字符)
\D    匹配任意非数字的字符。
\B    匹配不是单词开头或者结尾的字符。
[^x]   匹配除了x的以外的任意字符。
[^aeiou]   匹配除了aeiou以外的字符。

  • 0x7  后向引用

使用小括号指定一个子表达式,匹配这个表达式的文本可以在表达式或者其他程序中做进一部处理。默认情况,分组从左到右分配组号,1,2,3................
注意:分组0对应整个表达式;分配过程有两次,第一遍给未命名的组分配,第二次给命名组分配,所以命名组组号大雨未命名组;(?:exp) 该组不分配组号。exp指表达式。后向引用可以重复搜索前面分组匹配到的单词。反斜杠后面跟组号 ,\1,就能引用。
也可以指定组名。语法为(?<word>exp),或者(?‘word’exp)这样组名就指定为word。引用的话就可以使用\k<word>。
(exp)   匹配exp,自动命名
(?<word>exp),(?'word'exp)    匹配exp,组名word
(?:exp)  匹配exp,不捕获文本。

  • 0x8  零宽断言

第一次看到这个名字,就醉了。什么鬼啊。先看看有哪些鬼。
(?=exp)      匹配exp前面的位置,以exp结尾不带exp的部分
(?<=exp)    匹配exp后面的位置,以exp开头不带exp的部分
(?!exp)       匹配后面跟的不是exp的位置,后面不是exp得都行
(?<!exp)     匹配前面不是exp的位置。前面不是exp的都行。
太反人类了,以后用到在研究。

  • 0x9  注释

(?#这个就是注释,我就不多写了)

  • 0x10  贪婪和懒惰

这小结比较重要。因为常用。默认情况下匹配重复的时候正则表达式会尽可能匹配最多个字符。这就是贪婪。
那么懒惰就是在重复符后面加个?问号
*?     重复任意次尽可能少
+?    重复一到任意次尽可能少
??   ~~~~~~脑补~~~~~~~~
{n,m}?    ~~~~~~脑补~~~~~~
{n,}?     ~~~~~~脑布~~~~~~

  • 0x11  处理选项

Ignorecase              忽略大小写
Multiline                   多行,改变&和^的意思
Singleline                单行,更改.的意思,使它和每一个字符匹配
IgnorePatternWhitespace            忽略表达式中的非转义空白并启用#标记的注释,看不懂
ExplicitCapture       仅捕获已经被显示命名的组。

  • 0x12 未讲到的东西

 代码/语法说明\a报警字符(打印它的效果是电脑嘀一声)\b通常是单词分界位置,但如果在字符类里使用代表退格\t制表符,Tab\r回车\v竖向制表符\f换页符\n换行符\eEscape\0nnASCII代码中八进制代码为nn的字符\xnnASCII代码中十六进制代码为nn的字符\unnnnUnicode代码中十六进制代码为nnnn的字符\cNASCII控制字符。比如\cC代表Ctrl+C\A字符串开头(类似^,但不受处理多行选项的影响)\Z字符串结尾或行尾(不受处理多行选项的影响)\z字符串结尾(类似$,但不受处理多行选项的影响)\G当前搜索的开头\p{name}Unicode中命名为name的字符类,例如\p{IsGreek}(?>exp)贪婪子表达式(?<x>-<y>exp)平衡组(?im-nsx:exp)在子表达式exp中改变处理选项(?im-nsx)为表达式后面的部分改变处理选项(?(exp)yes|no)把exp当作零宽正向先行断言,如果在这个位置能匹配,使用yes作为 此组的表达式;否则使用no(?(exp)yes)同上,只是使用空表达式作为no(?(name)yes|no)如果命名为name的组捕获到了内容,使用yes作为表达式;否则使用 no(?(name)yes)同上,只是使用空表达式作为no

 

 

 

 

 

0 0
原创粉丝点击