309
09
09xxde4903
903
903

解决方案 »

  1.   

    (?!pattern) 负向预查,和你说的是一回是吗?能详细解答一下吗
      

  2.   

    误导了楼主,
    帮你顶顶。$a = "987231\n";
    $b = "987231";
    $c = '987232';$e='/^(?!0)(?:([0-9])(?!.*?\1))+$/';
    //$e1='/^(?!0)(?:([0-9])(?!.*?\1))+/';  
    preg_match($e, $a, $matches);
    print_r($matches);
      

  3.   

    var exp2=/^(?!0)(?:([0-9])(?!.*?\1))+$/;^ 匹配字符串开始
    (?!0) 匹配此位置字符部位0(学名叫做零宽度负预测先行断言(?!exp)^(?!0)即匹配不以0开始的字符串
    (?: )+ 不命名该捕获组,要求匹配1次或1次以上
        ([0-9]) 捕获组,自动分配组号1,[0-9] 匹配数字,相当于\d
        (?! ) 零宽断言再度出现,匹配该处不出现指定字符
            .*?\1 懒惰匹配,尽可能少的匹配,以分组1的值结尾
    有必要说明一下贪婪和懒惰匹配:
    举个例子,贪婪: 1.*2 这里匹配由1开始,2结尾的字符串,尽可能多地匹配。比如说 122222222222
    由1开始2结尾,那么这里匹配的就是整个字符串122222222222
    懒惰:1.*?2 同样匹配由1开始2结尾,但是极可能少地匹配。例如上面的122222222222
    它匹配下来的就是字符串12了

    回到正题,.*?\1 就是匹配由 分组1结尾的字符串。也就是说该字符在字符串中有重复出现: 比如说 11 和 1231
    但是因为加了零宽断言?!,显然,作用就是用来匹配字符串中不会有重复字符出现
    (所以这里用贪婪或懒惰都行,效果都一样)         
     
      

  4.   

    看懂这个用法就明了了:
    (a)(?!.*?\1)
    表示在该字符串中 a的后面不会重复出现a
    又加了一个(?:)+用来重复检查最终确保整个字符串中不会出现重复字符
      

  5.   

    今天给个正确答复给你。
    首先,明确一下(?!.*?\1)是个位置匹配,像   ^ $ \b 
    ?!  否定顺序环视   注意下.*?是个非贪婪模式,就是说越小。例子:
    主要说下(?:([0-9])(?!.*?\1))+$。
    456264
    4     .*?\1   (5626) 是 .*?   4是\1  注意是非贪婪模式 
     
    4567
    ?!  否定顺序环视   非贪婪模式
    4    .*?\1   (567)是.*?  没有是\1    否定符合         $ 不是结尾
    45    .*?\1   (67)是.*?  没有是\1    否定符合         $ 不是结尾
    456   .*?\1   (7)是.*?  没有是\1    否定符合         $ 不是结尾
    4567  .*?\1   (没有)是.*?  没有是\1    否定符合         $ 是结尾
    所以4567符合。4567\n
    4    .*?\1   (567\n)是.*?  没有是\1    否定符合         $ 不是结尾
    45    .*?\1   (67\n)是.*?  没有是\1    否定符合         $ 不是结尾
    456   .*?\1   (7\n)是.*?  没有是\1    否定符合         $ 不是结尾
    4567  .*?\1   \n是.*?  没有是\1    否定符合           $ 是结尾
    所以4567\n符合。
      

  6.   

    这个说错了
    4567\n
    4    .*?\1   (567\n)是.*?  没有是\1    否定符合         $ 不是结尾
    45    .*?\1   (67\n)是.*?  没有是\1    否定符合         $ 不是结尾
    456   .*?\1   (7\n)是.*?  没有是\1    否定符合         $ 不是结尾
    4567  .*?\1   \n是.*?  没有是\1    否定符合           $ 是结尾
    所以4567\n符合。更正。
    4567\n
    4    .*?\1   (567\n)是.*?  没有是\1    否定符合         $ 不是结尾
    45    .*?\1   (67\n)是.*?  没有是\1    否定符合         $ 不是结尾
    456   .*?\1   (7\n)是.*?  没有是\1    否定符合         $ 不是结尾
    4567  .*?\1   没有是.*?  \n是\1    否定符合           $ 是结尾
    所以4567\n符合。