Regexp
REGEXP正则表达式
Regular Expressions
使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串由一类特殊字符及文本字符。
正则表达式通过专门的软件模块进行编译,执行处理,比如PCRE
。
正则表达式中的匹配元字符大概分为四类:字符匹配、匹配次数、位置锚定、分组
Linux下可以通过man 7 regex
查看相关帮助。
分为基本正则表达式BRE
和扩展正则表达式ERE
。ERE
相较于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&"
=> 匹配内容仅为
分组
想要对某个字符串进行匹配可以用()
将匹配的内容括起来匹配,但(
和)
都属于特殊字符,需要转义,即使用\( \)
即可。
正则表达式引擎会将分组中模式匹配的内容存入内部变量中,命名方式为\1
,\2
,\3
... 这通常称为后项引用
需要注意的是,后项引用所指向的是第 n 组匹配的值,而非匹配模式,例如:
\([0-9]\{3\}\).*\1
=> 表示的是匹配三个数字,并且该行之后再次出现了这三个数字的行
且,当有嵌套关系的时候表示从左边起,第 n 个括号中的内容:
\(string_a\+\(string_b\)\)
\1
=>string_a\+\(string_b\)
\2
=>string_b
可以使用\|
将相同匹配模式的分组合并,例如匹配a
或b
开头的行
^\(a\|b\)
其他特殊元字符
Regexper
推荐Regex可视化工具:Regexper
其可将正则表达式输入查看执行过程:
截取文件基名:
通过以下方式匹配文件的后缀名,然后替换为空,即可
匹配proto文件中的validate:
最后更新于