简单入门正则表达式 - 第五章 多字符的匹配

系统 1458 0
<style> #content-region { background-image: url(http://p.blog.csdn.net/images/p_blog_csdn_net/rcom10002/EntryImages/20081027/watermark.gif); } #content-region h3 { border: 1px dotted #333333; background-color: #f9f9f9; padding: 10px; font-size: 24px; } #content-region p { font-family: "宋体", "仿宋"; font-size: 16px; line-height: 28px; text-decoration: none; text-indent: 32px; } #content-region .regex-pattern { font-style: oblique; font-family: "Courier New", Courier, monospace; background-color: #FFCCCC; border-top-style: solid; border-right-style: none; border-bottom-style: solid; border-left-style: none; border-top-color: #FF0000; border-bottom-color: #FF0000; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-right-color: #FF0000; border-left-color: #FF0000; padding: 0px 5px 0px 5px; } #content-region .regex-result { font-family: "Courier New", Courier, monospace; background-color: #A4FFE1; border-top-style: solid; border-right-style: none; border-bottom-style: solid; border-left-style: none; border-top-color: #339966; border-bottom-color: #339966; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-right-color: #339966; border-left-color: #339966; padding: 0px 5px 0px 5px; } #content-region blockquote { padding: 10px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dotted; border-right-style: dotted; border-bottom-style: dotted; border-left-style: dotted; width: auto; } #content-region img { border: 1px dotted #000000; padding: 16px; background-color: #f9f9f9; margin-top: 16px; margin-right: 16px; margin-bottom: 16px; margin-left: 64px; } #content-region code { white-space: pre; } </style>

一、字符集合

字符集合,也可以叫做字符类,它允许我们从多个候选字符中提取一个满足条件的字符。它的语法形式有两种, [abcdef] [a-f] 。虽然是集合,但每次只允许匹配一个单字符,如果要进行重复性匹配操作,就要借助“*”、“+”和花括号的功能了。让我们先学习一下[abcdef]这种形式的用法。

假如我们要对电话号码格式进行验证,以“+086-800-800-8888”为例,其中 +086 的加号和首位数字都是可选字符。现在,我们对号码的第二个字符进行分析,它是一个 0 至 9 的数字,字符集合的表示方法是[0123456789],它可以与 0 至 9 之间的任意一个字符进行匹配。接下来我们要做的就是确定每个部分的匹配次数, [0123456789]{3} [0123456789]{3} [0123456789]{3} [0123456789]{4} 。又因为 086 的首位可选,所以,我们最终构造出来的正则表达式语法为 /+?[0123456789]{2,3}-[0123456789]{3}-[0123456789]{3}-[0123456789]{4} 。这里值得注意的地方是“+”需要转义,因为“+”是正则表达式的语法一部分,它是具有特殊含义的,无法被我们直接利用,如果要使用“+”,就要对它进行转义。转义后的“/+”能告诉正则表达式引擎,当前这个“+”不是语法具有特殊意义,只是一个字符“+”而已。

简单入门正则表达式 - 第五章 多字符的匹配

二、字符范围的表示

字符集合的第二种语法形式 [a-f] 可以简化连续字符的书写方法,上例中的 [0123456789] 就能够简化为 [0-9] ,这样,简化后的语法就成为 /+?[0-9]{2,3}-[0-9]{3}-[0-9]{3}-[0-9]{4} 。我们还可以混合使用字符集合的语法,来提高灵活性。如 [a-fuwy0-9]

简单入门正则表达式 - 第五章 多字符的匹配

如果方括号内的“-”的两端不是表示范围开始和结束的字符的话,它就会被当作普通的“-”来处理。让我们再看一个例子。现在要从句子“Javascript includes built-in support for array, date, and Regular-expression objects.”中提取那些含有“-”的复合词。我们先采用字符集合的形式来匹配“-”,使用语法 [a-zA-z]+[-][a-zA-z]+ ,当然我们也可以直接写“-”来进行匹配 [a-zA-z]+-[a-zA-z]+

简单入门正则表达式 - 第五章 多字符的匹配

看了上面的例子有些读者可能会感到很奇怪,既然可以指定字符集合的范围,我们为什么不直接写 [A-z] ,而要采用 [a-zA-Z] 这种形式呢?这是因为在ASCII和Unicode字符集中,大小写字母的位置并不是连续的,它们之间还有六个其它字符,如下图所示:

三、使用补集^

前面的两种语法都是正常匹配时所要用到的,但是,如果我们想使一个不存在于字符集合中的字符满足匹配条件时,又该怎么实现呢?换一句话说,除了集合之外的所有字符都是我们想要匹配的字符,正则表达式提供了一种 [^abcf-i] 的语法形式。对于这种语法,我们可以先按照正常思路考虑 [abcf-i] 的含义,匹配 abc 中任意一字符和 f 至 i 之间的字符,然后转过来理解,不满足 abc 中任意一字符和 f 至 i 之间的字符的内容,都是我们想要匹配的目标。值得注意的是“^”必须紧挨在左方括号的右边,否则它就不具有特殊含义,只是普通的字符“^”而已。

简单入门正则表达式 - 第五章 多字符的匹配

四、选择

字符集合能够从多个候选字符中选中一个来与目标字符进行匹配,但是,如何提供多个连续的候选字符组合呢?在正则表达式中,就有一个提供这样功能的元字符“|”。它将我们要匹配的字符组合用“|”分隔开,然后在目标字符串中进行匹配,只要有与分隔部分的内容能够匹配上的话,就能进行匹配。

下面是一段人物众多的小笑话,要理解起来本来是很费劲儿的,但通过正则表达式 魔王|公主|没有人|曹操|鬼|靠|谁|上帝 把所有的人物角色全列出来,就容易理解得多了。

      《喊破喉咙》

      
        魔王
      
        公主
      
      带回了自己的城堡。 

      
        魔王
      
      :你尽管喊破喉咙吧,
      
        没有人
      
      会来救你的! 

      
        公主
      
      :破喉咙!破喉咙! 

      
        没有人
      
        公主
      
      !我来救你了! 

      
        魔王
      
      :说
      
        曹操
      
      
        曹操
      
      到! 

      
        曹操
      
        魔王
      
      ,你叫我干嘛?! 

      
        魔王
      
      :哇勒!看到
      
      了!! 

      
      !被发现了! 

      
      :胡说,
      
      发现我了! 

      
      :关我屁事! 

      
        魔王
      
      :Oh~my God! 

      
        上帝
      
      叫我?! 

      
        没有人
      
      叫你啊! 

      
        没有人
      
      :我哪有!! 

      
        魔王
      
      从此得了精神分裂症…… 
	
    

五、知识要点补充与巩固

到现在为止,我们已经学会了很多基本的样式匹配,下面表格中是对前面的知识内容的一个总结。

语法形式 语法含义
A 匹配一个单一字符“A”
. 匹配任意一个字符
? 重复零次或一次
/? 转义后的字符“?”
* 重复零次或更多次(贪婪模式)
+ 重复一次或更多次(贪婪模式)
*? 重复零次或更多次(懒惰模式)
+? 重复一次或更多次(懒惰模式)
{n} 重复 n 次
{n,} 重复 n 次或更多次
{m,n} 重复 m 到 n 次(贪婪模式)
{m,n}? 重复 m 到 n 次(懒惰模式)
[abc] 匹配“a”,“b”,“c”中的任意一个字符
[abcf-i] 匹配“a”,“b”,“c”,“f”至“g”中的任意一个字符
[^1-37a-gx] 匹配“1”至“3”,“7”,“a”至“g”,“x”之外的任意一个字符
<!-- InstanceEndEditable -->

简单入门正则表达式 - 第五章 多字符的匹配


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论