perl正则语法总结

55 阅读3分钟

本文分享自天翼云开发者社区《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)\))$

如果开头是 ( ,结尾必须是 )