a字符串: 222231235
b字符串: l23jl5353la字符串必须全是数字,数字随机,长度随机。
b字符串必须是字母与数字结合,并且顺序随机,长度随机。怎么才能匹配b 而不匹配a呢?

解决方案 »

  1.   

    本帖最后由 lxcnn 于 2010-09-24 16:46:40 编辑
      

  2.   

    你的问题描述的稍微有点绕了,根据实际情况,完全可以简化一下描述,看下是以下两种情况中的哪一个:1、字母和数字组成,必须同时包含字母和数字
    2、字母和数字组成,必须包含字母,数字可有可无如果是情况2,那就用1楼的正则,如果是情况1,再加一个判断
    ^(?![0-9]+$)(?![^0-9]+$)[a-zA-Z0-9]+$ 
      

  3.   

    既然.net,支持(?=exp),是否可以优化一下呢。
    ^(?=[^0-9]*[0-9])(?=[^a-zA-Z]*[a-zA-Z])[0-9a-zA-Z]*$
    这样可以尽快的发现数字或非数字的让正确的情况下(?=)能尽快有结果。
      

  4.   

    在这种需求情况下,两种方式的匹配效率基本上是一样的,没有多少差异以楼主的需求为例,以下两个子表达式是对应的达到同一目的的
    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)都可以达到目的对于这种输入的验证,通常字符都不会很多,所以只要不出现多个非贪婪模式,或者量词的嵌套,效率上的差异基本上是感觉不到的