看看这个正则咋写? a字符串: 222231235b字符串: l23jl5353la字符串必须全是数字,数字随机,长度随机。b字符串必须是字母与数字结合,并且顺序随机,长度随机。怎么才能匹配b 而不匹配a呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 本帖最后由 lxcnn 于 2010-09-24 16:46:40 编辑 你的问题描述的稍微有点绕了,根据实际情况,完全可以简化一下描述,看下是以下两种情况中的哪一个:1、字母和数字组成,必须同时包含字母和数字2、字母和数字组成,必须包含字母,数字可有可无如果是情况2,那就用1楼的正则,如果是情况1,再加一个判断^(?![0-9]+$)(?![^0-9]+$)[a-zA-Z0-9]+$ 既然.net,支持(?=exp),是否可以优化一下呢。^(?=[^0-9]*[0-9])(?=[^a-zA-Z]*[a-zA-Z])[0-9a-zA-Z]*$这样可以尽快的发现数字或非数字的让正确的情况下(?=)能尽快有结果。 在这种需求情况下,两种方式的匹配效率基本上是一样的,没有多少差异以楼主的需求为例,以下两个子表达式是对应的达到同一目的的a、 (?=[^0-9]*[0-9])b、 (?![^0-9]+$)a中,[^0-9]*交出控制权只有两种情况,遇到第一个数字或结尾,此时交出控制权给[0-9],如果此时是数字,则报告匹配成功,如果是结尾,则报告失败,回溯b中,[^0-9]+交出控制权也只有两种情况,遇到第一个数字或结尾,此时交出控制权给$,如果此时是数字,$匹配失败,而环视报告匹配成功,如果是结尾,$匹配成功,而环视报告失败,回溯可见两种方式,交出控制权的时机和回溯的次数基本上是一致的,而$相对于[0-9]所做的判断还要少一点匹配失败时也是同样的道理最初采用(?!exp)形式,而不是(?=exp)形式,是因为在早期的IE6下,对(?=exp)的支持上有bug,经常会出现错误的结果,所以对于这种需求,延续了(?!exp)的写法不过现在的IE6以上版本,都已经修正了这个bug,所以使用(?!exp)或者(?=exp)都可以达到目的对于这种输入的验证,通常字符都不会很多,所以只要不出现多个非贪婪模式,或者量词的嵌套,效率上的差异基本上是感觉不到的 把listview内容发送到excel文件 如何实现查询 求虚拟键盘控件 C#开发 可以让方法只执行一次吗 请教WinForm程序的本地配置文件格式及一般读写模式 请教组件开发中的一个技术问题 两个数据之间的“与”用什么实现呢,就像VB中的AND作用相同的符号是哪个呢?? 采集google关键词的排名,出现验证码? 请教一个如何用C#取XML值得问题 向Web Service请求资源的问题 路由器更新固件的工作原理,所用协议? 为什么是空字符串
2、字母和数字组成,必须包含字母,数字可有可无如果是情况2,那就用1楼的正则,如果是情况1,再加一个判断
^(?![0-9]+$)(?![^0-9]+$)[a-zA-Z0-9]+$
^(?=[^0-9]*[0-9])(?=[^a-zA-Z]*[a-zA-Z])[0-9a-zA-Z]*$
这样可以尽快的发现数字或非数字的让正确的情况下(?=)能尽快有结果。
a、 (?=[^0-9]*[0-9])
b、 (?![^0-9]+$)
a中,[^0-9]*交出控制权只有两种情况,遇到第一个数字或结尾,此时交出控制权给[0-9],如果此时是数字,则报告匹配成功,如果是结尾,则报告失败,回溯
b中,[^0-9]+交出控制权也只有两种情况,遇到第一个数字或结尾,此时交出控制权给$,如果此时是数字,$匹配失败,而环视报告匹配成功,如果是结尾,$匹配成功,而环视报告失败,回溯
可见两种方式,交出控制权的时机和回溯的次数基本上是一致的,而$相对于[0-9]所做的判断还要少一点
匹配失败时也是同样的道理
最初采用(?!exp)形式,而不是(?=exp)形式,是因为在早期的IE6下,对(?=exp)的支持上有bug,经常会出现错误的结果,所以对于这种需求,延续了(?!exp)的写法
不过现在的IE6以上版本,都已经修正了这个bug,所以使用(?!exp)或者(?=exp)都可以达到目的对于这种输入的验证,通常字符都不会很多,所以只要不出现多个非贪婪模式,或者量词的嵌套,效率上的差异基本上是感觉不到的