xwill

To be double-cool

04 Jan 2021

[tip]-- 正则表达式

开篇一条:

`(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]`
`((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+$,\w]+@)?[A-Za-z0-9.-]+(:[0-9]+)?|(?:ww‌​w.|[-;:&=\+$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?‌​(?:[\w]*))?)`

通常看到正则总有火星文的感觉。其实正则就和我们打扑克一样,只要弄清楚了基本规则,也就能大致明白。至于高效优雅的耍起来,需要多理解练习。那就是下一个话题了。

开门见山:

  1. 元字符
    . 匹配除换行符以为的任意字符
    \w 匹配字母,数字,下划线,汉字
    \s 匹配任意空白符
    \d 匹配数字
    \b 匹配单词的开始或者结束
    ^ 匹配字符串的开始
    $ 匹配字符串的结束

注意以上w/s/d/b是小写字符。 大写表示不同的含义。 或者更准确点,是非的含义。 \W 非字母,非数字,非下划线,非汉字的字符 \S 非空格的字符 \D 非数字的字符 \B 非单词的开始和结束(单词的中间)

  1. 重复限定 *, 0次or更多 +, 1次or更多 ?, 0次or1次 {n,m}, n次到m次 重复限定是贪婪匹配。 \d{3,6} //这个表示匹配3到6个数字,如果6个则匹配6个 非贪婪(懒惰) 语法: 重复限定幅号后面加 ?

  2. 组合 () 为一个整体,内部可以 或这种,

  3. 转义

  4. 条件或 |

  5. 区间 [] one of them 的意思,注意 | 字符,即[a|b|c] 指a/b/c/| 4个字符中的一个

第二部分

零宽断言 断言好懂,零宽的含义,可以理解为 断言语句在整个表达式里不占位置,只是用来标记位置,帮助准确匹配.

比如: “a regular expression” 要想匹配 regular 中的 re,但不能匹配 expression 中的 re

语法:

?= pattern   正向先行 匹配pattern表达式前面的内容     可以写 re(?=gular)
?<= 	     正向后行 匹配pattern表达式后面
?!           负向后行 匹配非pattern表达式的前面内容
?<!
先行和后行
正则表达式引擎在执行字符串和表达式匹配时,会从头到尾(从前到后)连续扫描字符串中的字符,
设想有一个扫描指针指向字符边界处并随匹配过程移动。
先行断言,是当扫描指针位于某处时,引擎会尝试匹配指针还未扫过的字符,先于指针到达该字符,故称为先行。
后行断言,引擎会尝试匹配指针已扫过的字符,后于指针到达该字符,故称为后行。
正向和负向

不等于 (!=)、逻辑非 (!) 都是用 !号来表示,所以有 ! 号的形式表示不匹配、负向;
将 ! 号换成 = 号,就表示匹配、正向。

捕获 –> 匹配

分组  --> ()

给组号命名<name>
	语法: (?<name>exp)

反向引用

捕获的捕获组,外部引用,内部引用即反向引用
	语法:\k \number
         \k \'name'  ?????

贪婪 非贪婪

多个贪婪的匹配权   ?????
懒惰(非贪婪) 格式,后面加个 ?

反义

前面的介绍,理解完,应该比较容易看懂别人的正则了。 那么下面就是多写写正则,尝试用用规则,写的优雅高效些。

1>. 小括号():匹配小括号内的字符串,可以是一个,也可以是多个,常跟“|”(或)符号搭配使用,是多选结构的

  示例1:string name = “way2014”; regex:(way|zgw) result:结果是可以匹配出way的,因为是多选结构,小括号是匹配字符串的

  示例2:string text = “123456789”; regex:(0-9) result:结果是什么都匹配不到的,它只匹配字符串"0-9"而不是匹配数字, [0-9]这个字符组才是匹配0-9的数字

 2>.中括号[]:匹配字符组内的字符,比如咱们常用的[0-9a-zA-Z.?!]等,在[]内的字符都是字符,不是元字符,比如“0-9”、“a-z”这中间的“-”就是连接符号,表示范围的元字符,如果写成[-!?(]这样的话,就是普通字符

  示例1: string text = “1234567890”; regex:[0-9] result:结果是可以匹配出字符串text内的任意数字了,像上边的【或符号“|”在字符组内就是一个普通字符】

  示例2:string text = “a|e|s|v”; regex:[a|e|s] result:结果就是匹配字符a、e、|三个字符,这个跟(a|e|s)有区别的,区别就是(a|e|s)匹配的是a、e、s三个字符的随意一个,三个中的任意一个,这里的|是元字符

 3>.大括号{}:匹配次数,匹配在它之前表达式匹配出来的元素出现的次数,{n}出现n次、{n,}匹配最少出现n次、{n,m}匹配最少出现n次,最多出现m次