加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式学习笔记

发布时间:2020-12-13 22:20:18 所属栏目:百科 来源:网络整理
导读:看了经典的30分钟入门正则表达式,有了这篇笔记。 0x1 元字符 像任何一门自然语言,正则表达式有他自己的元音字母——元字符,必须牢牢的记住每一个原字符的含义才能流畅看正则表达式。否则一遇到就查表是浪费时间且痛苦的。 常用的原字符: . 点号。一个点号
看了经典的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 换行符
e Escape
nn ASCII代码中八进制代码为nn的字符
xnn ASCII代码中十六进制代码为nn的字符
unnnn Unicode代码中十六进制代码为nnnn的字符
cN ASCII控制字符。比如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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读