加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式

发布时间:2020-12-13 22:30:32 所属栏目:百科 来源:网络整理
导读:1. POSIX定义的基本正则表达式(Basic Regular Expression, BRE) , 扩展正则表达式(Extended Regular Expression, ERE)。grep 使用的是BRE,egrep 使用的是ERE。fgrep 也叫快速grep (Fast grep),这个版本匹配固定字符串而非正则表达式,也是唯一可以并行地

1. POSIX定义的基本正则表达式(Basic Regular Expression, BRE) , 扩展正则表达式(Extended Regular Expression, ERE)。grep 使用的是BRE,egrep 使用的是ERE。fgrep 也叫快速grep (Fast grep),这个版本匹配固定字符串而非正则表达式,也是唯一可以并行地匹配多个字符串的版本。

2. POSIX BRE 与 ERE的meta字符(元字符即特殊字符)

字符 BRE/ERE 模式含义

两者都可 通常用以关闭后续字符的特殊意义。有时则是相反地打开后续字符的特殊意义,如:(...) 与

{...} 。

. 两者都可 匹配任何单个的字符,但NUL除外。独立程序也可以不允许匹配换行字符。

* 两者都可 匹配在它之前邻接的任何数目的单个字符(0~n),对于BRE来说,*如果置于正则表达式的第一个 字符,不具有任何特殊意义。

^ 两者都可 匹配紧接着的正则表达式,在行或字符串的起始处。BRE:仅在正则表达式的开头处具有特殊 含义,ERE:置在任何位置都具有特殊含义。

$ 两者都可 匹配前面的正则表达式,在字符串或行结尾处。BRE:仅在正则表达式结尾处有特殊含义。 ERE:置于任何位置都具有特殊含义。

[...] 两者都可 方括号表达式,匹配方括号内的任一字符。连字符(-)指的是连续字符的范围(注意:范围会 因为locale而有所不同,因此不具有可移植性)。^符号置于方括号里第一个字符则有反向含 义:指的是匹配不在列表内(方括号内)的任何字符。作为首字符的一个连字符或是结束 方括号( ] ),则被视为列表的一部分。所有其他的meta字符也为列表的一部分(则被视 为字面上的意义)。方括号表达式里可能会含有排序符号、等价字符集,及字符集。

{n,m} BRE 区间表达式,匹配在它前面的单个字符重现的次数区间。{n}指的是重现n次;{n,}则为至少 重现n次,而{n,m}为重现n至m次。n与m的值必须介于0至RE_DUP_MAX(含)之间,后者最 小值为255。

( ) BRE 将(与)间的模式存储在特殊的"保留空间"。最多可以将9个独立的子模式存储在单个模式中。匹 配于子模式的文本,可通过转义序列1至9,被重复使用在相同的模式里。例如(ab).*1(等 同于(ab).*(ab)) ),指的是匹配于ab组合的两次重现,中间可存在任何数目的字符。

n BRE 重复在(与)方括号内第n个子模式至此点的模式。n为1到9的数字,1为由左开始。

{n,m} ERE 与先前提及BRE的{n,m}一样,只不过方括号前没有反斜杠。

+ ERE 匹配前面正则表达式的一个或多个实例。

? ERE 匹配前面正则表达式的零个或一个实例。

| ERE 匹配于 | 符号前或后的正则表达式。

( ) ERE 匹配于方括号括起来的正则表达式群。


正则表达式范例:

表达式 匹配

tolstoy 位于一行上任何位置的7个字母:tolstoy

^tolstoy 7个字母tolstoy,出现在一行的开头

tolstoy$ 7个字母tolstoy,出现在一行的结尾

^tolstoy$ 正好包括tolstoy这7个字母的一行,没有其他的任何字符

[Tt]olstoy 在一行上的任一位置,含有Tolstoy或tolstoy

tol.toy 在一行上的任意位置,含有tol这3个字母,加上任何一个字符,再接着toy这3个字母

tol.*toy 在一行上的任意位置,含有tol这3个字母,加上任意的0或多个字符,再继续toy这3个字母


3. 字符集、排序符合、等价字符集

字符集是以[:与:]将关键字组合括起来的POSIX字符集。

POSIX字符集: 类别 匹配字符 类别 匹配字符

[:alnum:] 数字字符 [:lower:] 小写字母

[:alpha:] 字母字符 [:print:] 可显示的

[:blank:] 空格(space)与定位(tab)字符 [:punct:] 标点符号

[:cntrl:] 控制字符 [:space:] 空白(whitespace)字符

[:digit:] 数字字符 [:upper:] 大写字母字符

[:graph:] 非空格(nonspace)字符 [:xdigit:] 十六进制数字

注意:排序元素、等价字符集以及字符集,都仅在方括号表达式的方括号内认可,也就是说,像[:alpha:]这样的正则表达式,匹配字符为a、l、p、h以及:,表示所有英文字母的正确写法应为[[:alpha:]]。在方括号表达式中,所有其他的meta字符都会失去其特殊含义。所以[*.]匹配于字面上的星号、反斜杠以及句点。


4. 后向引用

BRE提供了一种叫后向引用的机制,指的是"匹配于正则表达式匹配的先前部分"。使用后向引用的步骤有两个。第一步是将子表达式包围在 (与) 里;单个模式里可包括至多9个子表达式,且可为嵌套结构。如:(ab)(cd)[def]*21,1指代了 (ab) ,2指代了(cd),则(ab)(cd)[def]*21 等同于 (ab)(cd)[def]*(ab)(cd)。


5. *号,可以匹配0个或者多个前面的单个字符。因此ab*c,可以"匹配1个a、0个或多个b字符以及一个c"。则这个正则表达式可以匹配的是ac、abc、abbc、abbbc、abbbbc、....


6. ^ 和 $ 这两个meta字符也叫做锚点,其用途限制正则表达式匹配时,针对要被匹配字符串的开始或者结尾处进行匹配(^跟在[^]中括号里面的意义不一样。)以下举例锚点匹配 abcABCdefDEF 字符串的范例:

模式 是否匹配 匹配文本(红色)/匹配失败的理由

ABC 是 居中的第4、5、6字符:abcABCdefDEF

^ABC 否 限定匹配字符串的起始处

def 是 居中的第7、8、9个字符:abcABCdefDEF

def$ 否 限制匹配字符串的结尾处

[[:upper:]]{3} 是 居中的第4、5、6个字符:abcABCdefDEF

[[:upper:]]{3}$ 是 结尾的第10、11、12个字符:abcABCdefDEF

^[[:alpha:]]{3} 是 起始的第1、2、3个字符:abcABCdefDEF

^与$仅在BRE的起始与结尾处具有特殊用途。在BRE下,ab^cd里的^表示的,就是自身的(^),ef$gh,同样是表示字面上的货币字符。


7. BRE运算符优先级,由高至低 ERE运算符优先级,由高到低

运算符 表示意义 运算符 表示意义

[. .] [= =] [: :] 用于字符排序的方括号符号 [. .] [= =] [: :] 用于字符对应的方括号符号

meta character 转义的meta字符 meta character 转义的meta字符

运算符 表示意义 [ ] 方括号表达式

[ ] 方括号表达式 ( ) 分组

( ) digit 子表达式与后向引用 * + ? { } 重复前置的正则表达式

* { } 前置单个字符重现的正则表达式 无符号(no symbol) 连续字符

无符号 (no symbol) 连续 ^ $ 锚点

^ $ 锚点 | 交替


8. ERE中没有后向引用,所有(与)匹配就是字面上的左括号与右括号。匹配多字符上的*的处理上和BRE是相同的。在BRE和ERE中的次数重复写法是不同的,BRE中的{5},ERE写成{5},重复10到42个q的写法,BRE中是q{10,42},在ERE中是q{10,42}。


9. ERE另外有两个meta字符,可以更细腻地处理匹配控制:

? 匹配于0个或一个前置正则表达式 + 匹配于1个或多个前置正则表达式

ab?c 匹配的有ac、abc ab+c 匹配的有abc、abbc、abbbc,却不匹配ac


10. | 运算符,可以理解成或的意思,满足其一即可。( ) 分组可以理解成数学中的括号。


11. 正则表达式的扩展,常见的扩展为 &; 与 &;运算符,分别匹配"单词(word)"的开头与结尾。如: &;chop 匹配于 use chopsticks,但不匹配eat a lambchop,同样地, chop&;匹配于 eat a lambchop而不匹配与use chopsticks,&;chop&;,二者皆不匹配。


12. 额外的GNU正则表达式运算符

运算符 含义

w 匹配任何单词组成字符,等同于[[:alnum:]_]

W 匹配任何非单词组成字符,等同于[^[:alnum:]_]

&; &; 匹配单词的起始与结尾,如前文所述

b 匹配单词的起始或结尾处所找到的空字符串。这是&; 与 &;运算符的结合注意由于awk使用b表示后退字符,因此GNU

awk(gawk)使用y来表示此功能

B 匹配两个单词组成字符之间的空字符串

' ` 分别匹配emacs缓冲区的开始与结尾。GNU程序(还有emacs)通常将他们视为与^及$同义


13.UNIX程序及其正则表达式类型

类型 grep sed ed ex/vi more egrep awk lex

BRE * * * * *

ERE * * *

&; &; * * * * *

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读