Keep Learning

伪程序员记录点滴

正则表达式学习

不同程序中的regex的使用

grep

表达式 含义
-E 扩展正则表达式
-G 基本正则表达式
-P perl基本表达式
-o 仅仅输出匹配结果
-v 进行求非操作
-c 计算匹配的总数

perl

表达式 含义
m/pattern/ 搜索
s/pattern/pattern/ 替换
qr/pattern/ 返回一个regex对象供以后使用
split() 把一个字符串拆分成子字符串
\i 不区分大小写
\g 全局搜索
$' 匹配前面的所有东西
$` 匹配之后的所有东西
$& 整个匹配的字符串

匹配纯字符串

表达式 含义
\ 用来对字符进行转义
. 可以用来表示任何字符

匹配一组字符

[]用来表示字符集合,出现在它们之间的字符可以使用。字符区间的关系。
字符区间可以在[]中使用-来实现。
注意:
-只有在[]中使用时才有特殊的含义,在其他环境中使用时,不需要使用\进行转义。
在字符区间中取非使用^元字符。
注意:
^的效果作用于给定字符集合里的所哟字符和字符区间,而不仅仅是紧跟在^后的那一个字符或字符区间。

使用元字符

对元字符转义需要用到\字符,这个字符对任何元字符都具有转义作用。
配对的元字符不用作元字符时必须被转义。

正则表达式 含义
[\b] backtrace
\f 换页符
\n 换行符
\r 回车符
\t 制表符(Tab)
\v 垂直制表符

匹配数字

正则表达式 含义
\d 任何一个数字字符,即[0-9]
\D 任何一个非数字字符,即[^0-9]

匹配字母和数字(包括_)

正则表达式 含义
\w [0-9a-zA-Z_]
\W [^0-9a-zA-Z_]

匹配空白

正则表达式 含义
\s [\f\n\t\r\v ]
\S [^\f\n\t\r\v ]

注意\b,即backtrace没有包含在\s中,因此也就灭有包含在\S中。

posix字符类

正则表达式 含义
[:alnum:] 任何一个字母或数字[a-zA-Z0-9]
[:alpha:] 任何一个字母[a-zA-Z]
[:blank:] 空格或制表符[\t ]
[:cntrl:] ASCII控制字符(ASCII 0~31, 127)
[:digit:] [0-9]
[:graph:] [:print:]不包括空格
[:lower:] [a-z]
[:punct:] 既不属于[:alnum:],也不属于[:cntrl:]的字符
[:space:] [\f\t\n\r\v ]
[:upper:] [A-Z]
[:xdigit:] [a-fA-F0-9]

重复匹配

  • +出现1次及以上,不包括0次。(是一个元字符,需要使用\进行转义)
    在[]中出现的类似+,.这样的元字符可以不被转义,可以正常使用,但是转义了也没有坏处。
  • *出现0次及以上,包括0次。(是一个元字符,需要使用\进行转义)
  • ?出现0次或者1次。(是一个元字符,需要使用\进行转义)
  • {} 出现的次数,用来精确匹配。可以是一个确定的数字,也可以是一个区间。
    如a{6} 出现6次a a{3,5} 至少3次a,最多5次a
    a{3,} 至少出现3次a,上限没有限制 注意: 在匹最好使用\/来进行匹配,防止不必要的麻烦。

+,*,{n,}都是贪婪型匹配,每次都尽可能的匹配更长的字符。若想使用这些的懒惰型匹配,在这些后面添加一个?即可。

贪婪型 懒惰型
* *?
+ +?
{n,} {n,}?

位置匹配

正则表达式 含义
\b 单词边界(用于一个\w与一个\W之间的匹配)|
\B 非单词边界
^ 字符串开头
$ 字符串结尾

使用子表达式

()是元字符,使用它们时需要使用转义,用于将一个子表达式合并在一起组成一个完整的部分。
|或者,是一个元字符,使用的时候需要使用转义。

回溯引用

指的是模式的后半部分引用在前半部分中定义的子表达式,可以把回溯表达式想象成变量。 \1 代表前面模式里的第一个表达式。(需要用括号括起来)

大小写字母转换

正则表达式 含义
\E 结束\L或\U转换
\l 下一个小写
\L \L和\E之间的全部小写
\u 下一个大写
\U \U和\E之间的全部大写

前后查找

向前查找

向前查找模式其实就是一个以?=开头的子表达式,需要匹配的文本跟在=的后面。找到=后面的即可,不消费它,即不把它包括在内。

例子:

.+(?=:)

提示:
任何一个子表达式都可以转换为一个向前查找表达式,只要给它加上一个?=前缀即可。

向后查找

?<=
例子: (?<=\$)

寻找$符号但是不消费它

警告:向前查找模式的长度是可变的,它们可以包含.+之类的元字符,长度很灵活。而向后查找模式只能是固定长度。

负向前查找

?!

负向后查找

?<!

嵌入式条件

Regex中的条件用?来定义

回溯引用中的条件

?(backreferrenc)true-regex)
?(backreferrenc)true-regex|false-regex)

前后查找条件