309
09
09xxde4903
903
903
09
09xxde4903
903
903
解决方案 »
- javascript执行和页面同步
- google的输入关键字提示用jquery+xml怎么做
- javascript循环!
- javascript中的单引号与双引号有什么区别?
- 求一个正则表达式,或能解决此问题的相应做法
- 如何利用DIV 和 jscript 实现页面分帧效果
- textarea取每一行文字
- 自动触发submit
- 加载google地图时,几率性的脚本错误。
- 【表单提交问题】提交表单后,弹出一对话框,有两个按钮:确定,取消。点击确定后,将表单提交;点击取消,则返回该页面。请问如何实现?
- var global = (function () { return this || (1, eval)('this'); }())这个怎么理解?
- 我想把所有网页的底色都改为黑色
帮你顶顶。$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);
(?!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
但是因为加了零宽断言?!,显然,作用就是用来匹配字符串中不会有重复字符出现。
(所以这里用贪婪或懒惰都行,效果都一样)
(a)(?!.*?\1)
表示在该字符串中 a的后面不会重复出现a
又加了一个(?:)+用来重复检查,最终确保整个字符串中不会出现重复字符
首先,明确一下(?!.*?\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符合。
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符合。