精通正则表达式之元字符

前端之家收集整理的这篇文章主要介绍了精通正则表达式之元字符前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

正则表达式组成

完整的正则的表达式是由两种字符组成的。特殊字符(special chararcters)称为“元字符”(Metachearacters),其他为“文字”(literal),或者是普通的文本字符(normal text characters)。正则表达式是与文件名模式(filename pattern)的区别就在于此,正则表达式的元字符提供了更强度的描述能力。文件名模式只是为有限的需求提供了有限的元字符,但是正则表达式“语言”为高级应用提供了丰富而且描述能力极强的元字符。

行的起始和结束

或许最容易理解的元字符就是脱字符号”^”和美元符号” ""′′" ”代表结束。我们曾经看到,正则表达式”cat”寻找的是一行文本中任意位置的cat,但是”^cat”只寻找行首的cat “^”用来把匹配文本(这个表达式的其他部分匹配的字符)“锚定”(anchor)在这一行的开头。同样,”cat$”只会寻找位于行末的cat,例如以scat结尾的行。
所以我们最好能养成安装字符来理解正则表达式的习惯。例如,不要这样:
“^cat”匹配以cat开头的行。
而应该这样理解:
“^cat”匹配的是以c作为一行的第一个字符,紧接着a,紧接着一个t的文本。
ps:虽然这两种理解的结果并无差异,但按照字符来解读更易于明白新遇到的正则表达式内部逻辑。
脱字符和美元符号的特别之处就在于,他们匹配的都是一个位置,而不是一个具体的文本。当然有很多方式可以匹配具体的文本。在正则表达式中,除了使用”cat”之类的普通字符,还可以使用下面的元字符。

元字符之字符组

作用:匹配若干字符之一
在一个字符组中可以列举任意多个字符。例如”[123456]”匹配1到6中的任意一个数字。这个字符组可以作为"<H[123456]>"的一部分,用来匹配<H1>、<H2>、<H3>等等。这个在我们搜索HTML代码的头文件时非常有用。
字符组元字符
在字符组内部,字符组元字符(character-class Metacharacter)‘-’(连字符)表示一个范围:”<H[1-6]>“与”<H[123456]>“是完全一样的。”[1-9]”和” [a-z]”是常用的匹配数字和小写字母的简便方式。多重范围也是容许的,例如”[123456789abcdefADCDEF]”可以写作”[0-9a-fA-F]”(捉着也可以写作”[a-f0-9A-F]”,顺序无所谓)。这三个表达式非常适合用于处理十六进制数字。我们还可以随心所欲地把字符范围与普通文本结合起来”[0-9A-Z]_!.?”能够匹配一个数字、大写字母、下划线、惊叹号、点号,或者是问号。
ps:
只有在字符组内部,连字符才是元字符——负责它就是只能匹配普通的连字符号。其实在字符组内部它也不一定就是元字符。如果连字符出现在字符组开头,它表示的就是一个普通字符,而不是一个范围。同样的道理问号和点号通常被当做元字符处理,但在字符组中则不是如此(说明白一点就是,”[0-9A-Z]_!.?”里面,真正的特殊字符就只有那两个连字符)。
例子截图:

元字符之排除型字符组

用”^…”取代”…”,这个字符组就会匹配任何为列出的字符。例如”^1-6”匹配处理1到6以外的任何字符。这个字符组中的开头的”^”表示“排除(negate)”,所以这里列出的不是希望匹配的字符,而是不希望匹配的字符。
ps:请记住,排除型字符组表示“匹配一个位列出的字符(amtch a character that’s not listed)”,而不是“不要匹配列出的字符(don’t match what is listed)”。这两种说法虽然看起来一样,但是还是有细微差异的参见”q[^u]” 匹配 Iraq的例子。有一种坚定的理解排除型字符组的办法,就是把他们看做普通的字符组,里面包含的是除了“排除型字符组中的所有字符”以外的字符。

元字符之用点号匹配任意字符

Matching Any Character with Dot
元字符”.”(通常称为点号dot或者小点point)是用来匹配任意字符的字符组的简便写法。如果我们需要在表达式中使用一个“匹配任何字符”的占位符(palaceholder),用点号就很方便。例如,如果我们需要搜索03/19/76、03-19-76或者03.19.76,不怕麻烦的话用一个明确容许‘/’‘-’‘.’的字符组来构建正则表达式,例如”03[-./]19[-./]76”。也可以简单地尝试”03.19.76”。

元字符之多选结构

Alternation
用来匹配任意字表达式
“|”是一个非常简捷的元字符,它的意思是“或”(or)。依靠它,我们能够把不同的字表达式组合成一个总的表达式,而这个总的表达式又能匹配任意的字表达式。例如”Bob”和”Robert”是两个表达式,但是”Bob|Robert”就是能够同时匹配其中任意一个的正则表达式。在这样的组合中,字表达式称为“多选分支(alternative)”。
再来看”gr[ea]y”的例子,有意思的是,它还可以写作”grey|gray”,或者是”gr(e|a)y”。
后者用括号来划定多选结构的范围(正常情况下,括号也是元字符)。
ps:请注意,”gr[ea]y”不符合我们的要求——–在这里,‘|’只是一个和”a”与”e”一样的普通字符。

元字符之单词分界符

Word Boundaries
使用正则表达式时经常会遇到的一个问题,期望匹配的“单词”包含在另一个单词之中。如cat、gray和Smith的例子。有些环境对正则表达式中单词的识别提供了有限的支持:也就是单词分解符(单词开头和结束的位置)的匹配。
有些egrep 中用”\<”和”>”来识别,还有的就是”\b”。
总结截图

PS:需要注意的几点总结

  • 注在字符组内部,元字符的定义规则(及它们的意义)是不一样的。例如,在字符组外部,点号是元字符,但是在内部则不是如此。相反,连字符只有在字符组内部(这是普通情况)才是元字符,否则就不是。脱字符在字符组外部表示一个意思,在字符组内部紧接[时表示另外一个意思,其他情况又表示别的意思。
  • 不要混淆多选项和字符组。字符组”[abc]”和多选项”(a|b|c)”固然表示同一个意思,但是这个例子中的相似性并不能推广开来。无论列出的字符有多少,字符组只能匹配一个字符。相反,多选项可以匹配任意长度的文本,每个多选项能匹配的文本都是独立的,例如”\<(1,000,000|million|thousand•thou>”。不过,多选项没有像字符组那样的排除功能
  • 注意排除型字符组是表示所有未列出字符的字符组的简便方法。因此,”[^x]”的意思并不是“只有这个位置不是x时才能匹配”,而是说“匹配一个不等以x的字符”。其中的差别很细微,但很重要。例如前面的概念可以匹配一个空行,而”[^x]”则不行。
  • -i 一般表示不区分大小写。
  • 以上为基本的元字符介绍,下一次介绍更重要的“可选项(optional)”?””和“计数”

猜你在找的正则表达式相关文章