文章目录
-
- what is re
- 使用场景
- 基础
- 元字符的概念以及元字符的反义
- 正则表达式的注释
- 正则表达式中的重复
- 分支条件
- 字符类
- 正则表达式的分组概念
- 分组的命名
- 正则表达式中的贪婪与懒惰
- 处理选项
- 反向引用
- 零宽断言的概念以及使用场景
- 负向零宽断言的概念以及使用场景
what is re
使用单个字符串来描述匹配一系列符合某个句法规则的字符串,regular expression
使用场景
- 破两提取/替换
- 在高级文本编译器中
- 在开发语言总使用验证输入输出
- 用户输入的合法性验证
- 爬虫
- 。。。
基础
- *是任意字符
- ?任意一个字符
元字符的概念以及元字符的反义
1.元字符
- .匹配出了换行符意外的任何字符
- \w匹配字母或数字或下划线或汉子
- \s匹配任意空白符
- \d匹配数字
- \b匹配单词的开始或结束
- ^匹配字符串的开始
-
$匹配字符串的结束
2.反义一般是将其大写
- \W 匹配任意不是字母,数字,下划线,汉字的字符
- \S 匹配任意不是空白符的字符
- \D 匹配任意非数字的字符
- \B 匹配不是单词开头或结束的位置
- [^x] 匹配除了x意外的字符
- [^aeiou] 匹配除了aeiou意外的字符括号里边加^就代表反义
如果就是想要匹配.或者?可以使用转义字符\来将特殊字符转普通字符
正则表达式的注释
- (?#)用来表示注释
- 分行+#来表示,这个我个人基本上不使用。
正则表达式中的重复
- *重复零次或更多次
- +重复一次或更多次
- ?重复零次或者1此
- {n}重复n此
- {n,}重复n次或者更多次
- {n,m}重复n到m次
分支条件
使用符号|将不同的规则分隔开。从左到右测试每个条件,如果满足来某个分支的话,就不会再管其它条件
eg. 0\d{2}-\d{8}|0\d{3}-\d{7}
意思是 0xx-xxxxxxxx或者0xxx-xxxxxxx
字符类
- [0-9] = \d
- [a-z0-9A-z] = \w
- eg.
代表啥可以自己看看\(?0\d{2}[)-]?\d{8}
正则表达式的分组概念
分组就是将子表达式做成子集,使用()来进行分组。例如
(\d{1,3}\.){3}\d{1,3}
可以看作是简单的IP地址的格式(虽然并没有进行严格的数字限制,例如255以上的不可用的规则并没有列出来)
分组的命名
格式:
(?<groupname>exp)
,而使用
(?:exp)
是不捕获匹配的文本,也不给此分组分配组号
正则表达式中的贪婪与懒惰
- 贪婪,对于贪婪来讲,如果文本是aabab,而表达式为a.*b,那么匹配出来的文本是aabab,表达式中的b匹配的是文本中最后一个b而不是第一个b,这就是贪婪。使用星号,尽可能多
- 懒惰,对于懒惰来讲,如果文本是aabab,而表达式为a.*?b,那么匹配出来的文本是aab,表达式中的b匹配的是文本中第一个b而不是其它b,这就是懒惰。使用星号问好,尽可能少
语法 | 说明 |
---|---|
*? | 重复任意次,但尽可能少重复 |
?? | 重复0次或一次,但尽可能少重复 |
+? | 重复一次或更多次,但尽可能少重复 |
{m,n}? | 重复m-n次,但尽可能少重复 |
{m,}? | 重复至少m次,但尽可能少重复 |
处理选项
语法 | 说明 |
---|---|
IgnoreCase | 匹配时不区分大小写 |
Multiline | 更改^和&的含义,使它们分别在任意一行的行首和行尾匹配而不是仅仅在整个字符串的开头和结尾匹配。 |
Singleline | 更改.的含义,使它与每一个字符匹配,包括\n换行符 |
IgnorePatternWhitespace | 忽略表达式中的非转义空白并启用由#标记的额注释 |
ExplicitCapture | 仅捕获以被显式命名的组 |
反向引用
如果要匹配 taobao taobao , home home 这样的情况应该如何处理
\b(\w+)\b\s+\b\1\b
或者
\b(?<hello>\w+)\b\s+\b\k\<hello>\b
注意多了个\k
零宽断言的概念以及使用场景
?+exp
零宽度正预测先行断言,自身出现的位置的后面能匹配表达式exp但是只需要前边的
i'm singing while you're dancing
exp: \b\w(?=ing\b)
?<=exp
零宽的正回顾后发断言,自身出现的位置的前面能匹配表达式但是只要后边的
reading a book
(?<=\bre)\w+\b
ading
负向零宽断言的概念以及使用场景
查找一段单词 单词其中出现了q,但是在q的之后跟的不是字母u
如果使用
\b\w*\q[^u]\w*\b
上面的表达式是有问题的。在q之后跟了
[^u]
,说明在q之后是有单词的,而且并不能是u,如果对于单词benq,就无法满足要求。所以需要使用负向零宽断言。
\b\w*1(?!u)\w*\b
?!之所以叫负向,就是没有这个单词
所以
?<!
也是同理