正则语言RE基础

what is re

使用单个字符串来描述匹配一系列符合某个句法规则的字符串,regular expression

使用场景

  1. 破两提取/替换
  2. 在高级文本编译器中
  3. 在开发语言总使用验证输入输出
  4. 用户输入的合法性验证
  5. 爬虫
  6. 。。。

基础

  • *是任意字符
  • ?任意一个字符

元字符的概念以及元字符的反义

1.元字符

  • .匹配出了换行符意外的任何字符
  • \w匹配字母或数字或下划线或汉子
  • \s匹配任意空白符
  • \d匹配数字
  • \b匹配单词的开始或结束
  • ^匹配字符串的开始
  • $匹配字符串的结束
    2.反义一般是将其大写
  • \W 匹配任意不是字母,数字,下划线,汉字的字符
  • \S 匹配任意不是空白符的字符
  • \D 匹配任意非数字的字符
  • \B 匹配不是单词开头或结束的位置
  • [^x] 匹配除了x意外的字符
  • [^aeiou] 匹配除了aeiou意外的字符括号里边加^就代表反义

如果就是想要匹配.或者?可以使用转义字符\来将特殊字符转普通字符

正则表达式的注释

  1. (?#)用来表示注释
  2. 分行+#来表示,这个我个人基本上不使用。

正则表达式中的重复

  • *重复零次或更多次
  • +重复一次或更多次
  • ?重复零次或者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

?!之所以叫负向,就是没有这个单词

所以?<!也是同理

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值