正则表达式要点有哪些

78次阅读
没有评论

共计 5001 个字符,预计需要花费 13 分钟才能阅读完成。

这篇文章主要介绍正则表达式要点有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

正则表达式(Regular
Expression)是强大、便捷、高效的文本处理工具。

正则表达式的元字符与其他字符结合起来,实现我们期望的功能。

典型元字符:

^    脱字符,一行的起始,匹配的是行开始的位置

$    美元符,一行的结束,匹配的是行结尾的位置

|    竖线、管道,多选结构,匹配分隔两边的任意子表达式

(…)   括号,限制竖线(管道)的作用范围,单用 grep 不支持,需用 grep - E 或 egrep

[…]    字符组,匹配里面的若干字符之一(正则表达式结构体 Construct[],列出在某处期望匹配的字符)

[^…]   排除型字符组,匹配未列出的任意字符

– 
  连字符,表示一个范围,用于字符组内部时才是元字符

.    点号,单个任意字符,用来匹配任意字符的字符组的简便写法

\   反斜线小于,单词分界符 \ 用于匹配单词(字符组合,字母数字符号)开头的位置

\   反斜线大于,单词分界符 \ 用于匹配单词(字符组合,字母数字符号)结束的位置

同一字符在不同位置,含义可能不一样,需注意区分。加参数 - i 表示匹配时不区分大小写。

实例分析:

cat  寻找一行文本中任意位置的 cat,如 cat、catalog、scat、scatter

^cat  寻找行首的 cat,如 catalog

cat$  寻找行尾的 cat,如 scat

^cat$ 
  只包含 cat 的行

^$ 
  空行,没有任何字符(包括空白字符)


  单独使用无意义

\ cat\   匹配单词 cat

 

^(From|Subject):  表示寻找以 From: 或者 Subject: 开头的行

包含型字符组:[123456]  匹配 1 到 6 中的任意一个数字

H[123456]   匹配 H1 ~ H6,可以写成 H[1-6],- 为连字符,用于字符组内部时,表示一个范围。

[0-9]  匹配一个数字

[a-z]  匹配一个小写字母

[A-Z]  匹配一个大写字母

[0-9A-Z_!.?]  匹配一个数字、大写字母、下划线、惊叹号、点或问号

[0123456789abcdefABCDEF]  可以写成 [0-9a-fA-F] 或者[A-Fa-f0-9],顺序无所谓,适合处理 16 进制数字

 

[abc]、[a-c]、(a|b|c)表示同一个意思,但不是所有字符都可以这样表示。字符组效率相对较高。

排除型字符组:[^…]  匹配任何未列出的字符,字符组内部开头的 ^ 表示排除(negate),列出不希望匹配的字符

n[^d]  匹配 n 后面不是字符 d 的行

[^d]  匹配不是仅包含字母 d 的行,即排除仅包含字母 d 的行

 

排除型字符组表示“匹配未列出的字符(match a character that’s not listed)”,而不是“不要匹配列出的字符(don’t match what is listed)”。

匹配文件目录 / 路径的方法:

./([^/]+)/  匹配./ 后面不是只有 / 但可以是其他字符(出现次数不限)的行,最后面还有 /

实测发现此正则表达式还不够严谨

因为. 是匹配单个任意字符(不一定是.  还可能是字母或其它字符)

若要匹配单独的.  需要加转义符 \ 或者脱字符 ^

实例:
[root@CentOS6 shell]# grep -E \./([^/]+)/ dir.txt   # 加转义符 \

./home/

./…yes../

./new/

./100/

./ 中国 /

./2015/

./2014-12-31/

[root@CentOS6 shell]# grep -E ^./([^/]+)/$ dir.txt  #加行首行尾锚定符 ^ 和 $

./home/

./…yes../

./new/

./100/

./ 中国 /

./2015/

./2014-12-31/

[root@CentOS6 shell]# cat dir.txt

//

.//

./home/

./…yes../

.//~/

./new/

./100/

./ 中国 /

./2015/

./2014-12-31/

/hometown/

yesterday

@China

.///

.////

.//~/~/

abcd//~/

..//../

[root@CentOS6 shell]#

用点号. 匹配任意字符:

元字符.(也称点号 dot、小点 point)是用来匹配任意字符的字符组的简便写法。

如果需要在表达式中使用一个“匹配任意字符”的占位符(placeholder),用点号. 就很方便。

例如:

要搜索 03/19/76、03-19-76、03-19-76,表达式可以写成字符组形式:03[-./]19[-./]76

也可以使用点号. 替代字符组:03.19.76

相对而言,03[-./]19[-./]76 更精确,03.19.76 里的点号. 匹配到还可能是其他字符。具体用哪个取决于目标文本的情况。

 

字符组内的点号. 不是元字符,仅代表普通的点字符;

在字符组内的连字符 -,是否表示范围要看其所在位置,在开头或结尾都不是表示范围,在中间(且不是在 [^ 后面)的才是。例如:[.-/] 中 - 是表示范围,但 [^-/.]、[./-] 里的 - 都不是表示范围。

管道 | 多选结构:匹配任意子表达式

| 也是一个元字符,意为或(or),通过它可以把不同的子表达式组合成一个总的表达式,在这样的组合中,子表达式称为“多选分支(alternative)”。

 

如:gr[ea]y  可以采用 | 写成 grey|gray,或者 gr(a|e)y。

注意不要写成 gr[a|e]y,这里面的 | 只是普通的字符,因为在字符组内部。

 

多选结构可以包括很多字符,但不能超越括号的界限。

一个字符组只能匹配目标文本中的单个字符,而每个多选结构自身都可能是完整的正则表达式,都可以匹配任意长度的文本。

 

(first|1st)与(fir|1)st    同一意思

(First|1st) [Ss]treet 与(Fir|1)st [Ss]treet    同一意思

在一个包含多选结构的表达式中使用脱字符 ^ 和美元符 $ 的时候要小心。

分析:

^From|Subject|Date:    匹配 ^From 或 Subject 或 Date:

^(From|Subject|Date):  匹配 ^From: 或 ^Subjec: 或 ^Date:  常用于提取 E -mail 文件中的信息

两者的匹配结果是不一样的。

如果希望在每个多选分支之前都有脱字符 ^,之后都有:,需要使用括号来限制(constrain)这些多选分支。

 

典型用法:

grep -E From:|Subject: test.txt

grep -E ^(From|Subject|Date): test.txt  // 单引号、双引号都可以,扩展正则

egrep ^(From|Subject|Date): test.txt

元字符序列 \ 和 \ 单词分界符:

使用正则表达式时经常会遇到一个问题,就是期望匹配的“单词”包含在另一个单词之中。

 

单词分界符 \ 和 \ 用于匹配单词开头和结束的位置。注意:和 本身并不是元字符,只有当它们与斜线 \ 结合起来的时候,整个序列才有特殊意义(称为元字符序列)。不是所有的 egrep 版本都支持单词分界符。

 

分析:

\ cat\ 意为匹配单词的开头位置,然后是 c a t 这 3 个字母,之后是单词的结束位置,简单的说就是匹配 cat 这个单词。

也可以用 \ cat 和 cat\ 来分别匹配以单词(或者说字母组合)cat 开头和结束的单词。

 

egrep(相当于 grep -E)认定的单词开头位置用向上的箭头标识,单词结束位置用向下的箭头标识。

“单词的开始和结束”准确地说是“字母数字字符号的开始和结束”。

 

可选项元素、通配符 Wildcards:

optional
items 可选项元素

 

问号?  代表可选项,表示任意单个字符,把它加在一个字符的后面,就表示此处容许出现这个字符,不过它的出现并非匹配成功的必要条件。哪个字符可选,? 就放在哪个字符后面。需要使用 egrep 或 grep -E。

 

color、colour    可以通过 colou?r 来匹配

July、Jul  可以通过 July? 或 (July|Jul) 来匹配

fourth|4th|4  可以通过 fourth|4(th)? 来匹配   嵌套了括号,问号? 作用的对象是整个括号内的内容。

括号及反向引用

括号的用途:

1、限制多选项的范围

2、将若干字符组合为一个单元,受问号? 或星号 * 之类量词的作用,如 four(th)?、(a)*

3、反向引用 backreference  容许匹配与表达式先前部分匹配的同样的文本

例如:\ ([A-Za-z]+).+\1\     这里的括号 () 和 \1 用于支持反向引用

 

在支持反向引用的工具软件中,括号 () 能够“记忆”其中的子表达式匹配的文本,不论这些文本是什么,元字符序列 \1 都能记住它们。而且,在一个表达式中可以使用多个括号,在用 \1、\2、\3 等来表示第一、第二、第三组括号匹配的文本。括号是按照开括号“(”从左至右的出现顺序进行的。

例如:([a-z])([0-9])\1\2 中的 \1 代表 [a-z] 匹配的内容,\2 代表 [0-9] 匹配的内容。

 

转义

. 本身是元字符,它可以匹配任何字符,包括空格。

真正匹配文本中点号. 的元序列应该是反斜线(backslash)加上点号的组合:

aga\.att\.com

\. 称为“转义的点号”或“转义的句号”,这种方法适用于所有的元字符,但在字符组内部无效。

这样使用的反斜线成为“转义符(escape)”——它作用的元字符会失去特殊含义,成为普通字符。

还可以用 \([a-zA-Z]+\)来匹配一个括号内的单词,例如(very),在开闭括号之前的反斜线消除了开闭括号的特殊意义,于是能够匹配文本中的开闭括号。

变量名:

许多程序设计语言都有标识符(identifier,例如变量名)的概念。

标识符只包含字母、数字以及下划线,但不能以数字开头。

可以用[a-zA-Z_][a-zA-Z_0-9]* 来匹配标识符:

第一个字符组匹配可能出现的第一个字符;

第二个(包括对应的 *)匹配余下的字符。

引号内的字符串:

匹配引号内的字符串,最简单的方法是使用表达式:”[^”]*”

 

两端的引号用来匹配字符串开头和结尾的引号。

在这两个引号之间的文本可以包括双引号之外的任何字符。

这里用 [^”] 来匹配除双引号”之外的任何字符,用 * 来表示两个引号之间可以存在任意数目的非双引号字符。

美元金额(可能包含小数):

\$[0-9]+(\.[0-9][0-9])? 是一种匹配美元金额的办法。

 

三个部分:\$、…+、(…)?

分别匹配一个美元符号、小数点前的数字(一个或一组数字)、小数点及其之后的数字(一个小数点和两位数字),可以匹配 $100.1 之类的美元金额,但不能匹配 $1,100 这样的金额,小数部分是可选的。

 

如果要匹配的是只包含价格而不含其他字符的行,可以在此表达式两端加上 ^…$,即:

^\$[0-9]+(\.[0-9][0-9])?$  开头为美元符 $,结尾为数字,且必须包含小数点,匹配结果与前者不同

这个表达式不能匹配 $.49。

 

因为:

^    脱字符,一行的起始,匹配的是行开始的位置

$    美元符,一行的结束,匹配的是行结尾的位置

网址 HTTP/HTML URL:

网址(Web URL)的形式可能有很多种,所以构造一个能够匹配所以形式的 URL 的正则表达式很有难度。

但如果只要求匹配大多数常见的 URL,则相对比较简单。

 

常见的 HTTP/HTML URL 样式如下:

http://hostname/path.html(或 htm)

 

主机名(hostname)(如 www.yahoo.com)的规则比较复杂,但因为主机名一般跟在 http:// 之后,可以写成:

[-a-z0-9_.]+ (可能应该是[-a-z0-9_.:]+)

path 部分的变换更多,需要写成:

[-a-z0-9_:@ ?=+,.!/~*%$]*

注意:用作普通字符的连字符 - 必须放在字符组的开头,用在字符组中间的是表示范围的元字符。

 

综合起来就是:

egrep -i‘\ http://[-a-z0-9_.:]+/[-a-z0-9_:@ ?=+,.!/~*%$]*\.html?\ files

 

更简化的版本:

egrep -i‘\ http://[^]*\.html?\ files

可能匹配出一些错误结果,根据具体需求调整表达式即可。

 

以上是“正则表达式要点有哪些”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注丸趣 TV 行业资讯频道!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计5001字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)