注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

ㄨiao愛

转载技术文档

 
 
 

日志

 
 

用正则匹配10个不相同的字母  

2012-03-22 10:40:07|  分类: 正则 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
求A-Z以内不重复的10个字母,并解释!

其实这个问题如果用正则来实现,思路是非常清晰的

首先因为是验证规则,所以“^”和“$”是必不可少的,分别区配开始和结束的位置
然后是10个字母,那么([A-Z]){10},合起来就是^([A-Z]){10}$
最后就是加一个规则,字母不能重复

如保证不能重复,必然是用到反向引用
(一个字母)后面任意一个字母不能与这个字母重复
这样实现起来就有两种方式,当然,实质都是一样的,一种是楼主给出的正则,另一种是
C# code
^(?:([A-Z])(?=((?!\1).)*$)){10}$

第二种写法上虽然比楼主所给的复杂了一点,但我认为效率上会比楼主给出的高点

解释一下正则的含义,先解释一下楼主给出的正则吧
C# code
^(?:([A-Z])(?!.*?\1)){10}$

^和$,以及{10}没什么好说的,自己去查资料
(?:exp) 是非捕获组,目的是不将()内的exp匹配的内容保存到捕获组中,之所以要这样用,是因为后面的反向引用使用的是\1,如果不用非捕获组,那么后面的\1就要换成\2,因为此时引用的就是第二个捕获组了
([A-Z]) 就是匹配A到Z之间的任意一个字母,并保存匹配结果到捕获组中
(?!.*?\1) 正向预搜索,它是零宽度的,虽然进行匹配,但不保存匹配结果,可以理解为它就是在所在位置的右侧附加了一个条件,用在这里表示,它所在位置的右侧,不管间隔多少个字符,都不能出现之前匹配到的那个字符

(?:([A-Z])(?!.*?\1)){10} 
就是匹配到这样一个字符
1、它首先是一个字母
2、然后这个字母的右侧间隔任意多个字符,不能再出现同样的字母
3、最后,符合以上两条规则的字符,一共有10个
加上首尾限定字符“^”和“$”,就成了楼主给出的正则

解释一下第二个正则
C# code
^(?:([A-Z])(?=((?!\1).)*$)){10}$

思路和其余部分全一样
(?=((?!\1).)*$) 这个表示,它所在位置右侧,一直到结尾,都不能是之前匹配到的那个字符
  评论这张
 
阅读(323)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017