Regexp

REGEXP正则表达式

Regular Expressions使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串由一类特殊字符及文本字符。

正则表达式通过专门的软件模块进行编译,执行处理,比如PCRE

正则表达式中的匹配元字符大概分为四类:字符匹配、匹配次数、位置锚定、分组

Linux下可以通过man 7 regex查看相关帮助。

分为基本正则表达式BRE和扩展正则表达式EREERE相较于BRE不需要对如(,),[,],+,|等元字符转义,但部分语言不支持ERE

**注:**Linux下的通配符用于匹配文件名,正则表达式可以用于匹配文件名,但更多的是用于文本的匹配

字符匹配

.:匹配除了/n,/r的任意一个字符

[]:匹配指定返回内的任意一个字符,如:[wang][0-9][a-zA-Z]

[^]:匹配范围外的任意字符

[:alnum:]:匹配单个字母和数字

[:alpha:]:匹配单个字母

[:lower:]:匹配单个小写字母[:upper:]:匹配大写字母

[:blank:]:匹配 空格 和 制表符

[:digit:]:匹配十进制数字[:xdigit:]:匹配十六进制数字

[:punct:]:匹配标点符号

注:'.'表示匹配单个任意字符,而在[]中表示字符'.'。如果想要不在[]中匹配字符'.'可以使用\'.'进行转义

示例:

“a.b” => 包含a + 任意字符 + b的行

"[^abc]" => 包含除了a,b,c有任意字符的行

"[[:digit:]]" => 匹配单个数字

匹配次数

在指定字符后添加可以指定该字符出现的次数:

*:匹配任意次数,包括 0 次

\?:匹配 0 或 1 次

\+:至少匹配 1 次

\{n\}:匹配 n 次

\{m,n\}:至少匹配 m 次,至多匹配 n 次

\{,n\}:至多匹配 n 次

\{n,\}:至少匹配 n 次

示例:

"g.*gle" => 匹配g + 任意个数字符 + gle

go\{2,3\}gle => 匹配g + 2-3个o + gle

位置锚定

对匹配字符的位置进行锚定:

^:行首

$:行尾

^PATTERN$^$联用可以整行匹配

^&:表示空行

^[[:space:]]*&:表示空白行

\<:单词开头,\>:单词结尾(数字,字母,下划线都会被算入单词)两个符号都可以用\b替换

?<=: 肯定式向后查找,匹配但不包括,?=肯定式向前查找,匹配但不包括。

?<!: 否定式向后查找,不匹配且不包括,?!否定式向前查找,不匹配且不包括。

特别注意的是,如果没有添加\<\>,单词中间符合匹配模式的字符串也会被查出来,比如查询"123",在"01234"中也会被查出来,如果不希望查出,请务必添加该锚定。

"^goo" => 匹配以goo开头的一行

"^google&" => 匹配内容仅为google的一行

分组

想要对某个字符串进行匹配可以用()将匹配的内容括起来匹配,但()都属于特殊字符,需要转义,即使用\( \)即可。

正则表达式引擎会将分组中模式匹配的内容存入内部变量中,命名方式为\1,\2,\3... 这通常称为后项引用

需要注意的是,后项引用所指向的是第 n 组匹配的值,而非匹配模式,例如:

\([0-9]\{3\}\).*\1 => 表示的是匹配三个数字,并且该行之后再次出现了这三个数字的行

且,当有嵌套关系的时候表示从左边起,第 n 个括号中的内容:

\(string_a\+\(string_b\)\) \1 => string_a\+\(string_b\) \2 => string_b

可以使用\|将相同匹配模式的分组合并,例如匹配ab开头的行

^\(a\|b\)

其他特殊元字符

Regexper

推荐Regex可视化工具:Regexper

其可将正则表达式输入查看执行过程:

^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$

截取文件基名:

通过以下方式匹配文件的后缀名,然后替换为空,即可

\.[^.]*$

匹配proto文件中的validate:

# 匹配以[(validate.rules)并接以换行或者任意字符为在前内容的 '];'
(?<=\[\(validate.rules\)[\s\S.]*)\];

最后更新于