本文分享自天翼云开发者社区《perl正则语法总结》.作者:李****壮
一、介绍
正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。Perl语言的正则表达式功能非常强大,基本上是常用语言中最强大的,很多语言设计正则式支持的时候都参考Perl的正则表达式
二、语法
2.1 元字符
字符
说明
.
匹配除换行符以外的任意字符
\w
匹配任何单词字符,包含字母或数字或下划线
\W
匹配任何非单词字符
\s
匹配任意的空白字符,包含空格、制表符、换页字符
\S
匹配任何非空白字符
\d
匹配数字字符
\D
匹配非数字字符
\f
匹配换页字符
\n
匹配换行符
\r
匹配回车字符
\t
匹配跳进字符
\v
匹配垂直跳进字符
\A
不区分单行多行模式,仅匹配字符串的开头。
^
单行模式匹配下,匹配字符串的开始。多行模式,匹配每一行的字符串开始
\z
不区分单行多行模式,匹配字符串的结束
$
单行模式匹配下,匹配字符串的结束。多行模式,匹配每一行的字符串结束
\b
匹配某个单词边界,即,某个单词和空格之间的位置。例如,st\b 匹配 test 中的 st,但是不匹配 testa 中的 st
\B
匹配非单词边界
\
取消元字符的转义
2.2 重复
代码
说明
*
重复零次或更多次
重复一次或更多次
?
重复零次或一次
{n}
重复n次
{n,}
重复n次或更多次
{n,m}
重复n到m次
<数量词>?
<数量词>指的是
、?等上述表格表达数量的字符,? 使、+、?、{} 变成非贪婪模式。例如*?、??
2.3 逻辑、分组
代码
说明
()
分组,并按( 出现的顺序依次赋值给匹配后的值,$n,n从1计数
示例:
字符串: aabbcc
正则表达式:((aa)(bb))cc
取值:
$0: aabbcc
$1: aabb
$2: aa
$3: bb
(?:...)
()的不分组版本,()内的匹配不编号
|
|代表左右表达式任意匹配一个
它总是先尝试匹配左边的表达式,一旦成功匹配则跳过匹配右边的表达式。
如果|没有被包括在()中,则它的范围是整个正则表达式
[]
字符集(字符类)。对应的位置可以是字符集中任意字符。
字符集中的字符可以逐个列出,也可以给出范围,如labc]或
[a-c]。第一个字符如果是^则表示取反,如[^abc]表示不是
abc的其他字符。
所有的特殊字符在字符集中都失去其原有的特殊含义。在字
符集中如果要使用]、-或^,可以在前面加上反斜杠,或把]
-放在第一个字符,把^放在非第一个字符。
(?P...)
分组,除了原有的编号外再指定一个额外的别名。例如(?Pabc)
\number
引用编号为number的分组匹配到的字符串,
例如 (\d)test\1 可以匹配 1test1 但不匹配 1test2
(?P=name)
引用别名为的分组匹配到的字符串
例如 (?P\d)test(?P=id) 可以匹配 1test1 ,但不匹配 1test2
2.4 断言
代码
说明
(?iLmsux)
iLmsux的每个字符代表一个匹配模式,只能用在正则表达式的开头,可选多个
iLmsux 可以为 i, L, m, s, u, x
i: 忽略大小写
L: 字符集本地化,为了支持多语言版本的字符集使用环境
u: 使用\w,\W,\b,\B这些元字符时将按照UNICODE定义的属性
m: 多行模式,改变 ^ 和 $ 的行为
s: '.' 的匹配不受限制,包括换行符
x: 冗余模式,可以忽略正则表达式中的空白和#号的注释
例如 (?i)aaa
(?#...)
#后的内容将作为注释被忽略
(?=...)
之后的字符串内容需要匹配表达式才能成功匹配,不消耗字符串内容
例如 a(?=b) 匹配 ab中的a ,不匹配 ad
(?!..)
之后的字符串内容需要不匹配表达式才能成功匹配,不消耗字符串内容。
例如 a(?!b) 匹配 ad中的a ,不匹配 ab
(?<=....)
之前的字符串内容需要匹配表达式才能成功匹配,不消耗字符串内容。
例如(?<=a)b,匹配ab 中的b ,不匹配 cb
(?<!....)
之前的字符串内容需要不匹配表达式才能成功匹配,不消耗字符串内容。
例如(?<!a)b,匹配cb 中的b ,不匹配 ab
(?(id/name)yes-pattern|no-pattern)
如果编号为id/别名为name的组匹配到字符,则需要匹配yes-pattern,否则需要匹配no-pattern,no-paternn可以省略。
例如 ^(\()?[^()]+(?(1)\))$
如果开头是 ( ,结尾必须是 )