正则表达式

一直不懂 2014-01-09 10:31:24
var exp2=/^(?!0)(?:([0-9])(?!.*?\1))+$/;
为匹配首位不是0的不重复数字,但是(?!.*?\1)不允许后面有重复的数字,为什么,请详细解答下特别是.*?连用
...全文
173 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
thy442030800 2014-01-12
  • 打赏
  • 举报
回复
引用 9 楼 shenchaohao12321 的回复:
[quote=引用 8 楼 thy442030800 的回复:] 看懂这个用法就明了了: (a)(?!.*?\1) 表示在该字符串中 a的后面不会重复出现a 又加了一个(?:)+用来重复检查最终确保整个字符串中不会出现重复字符
\1是引用哪个括号里的内容呢?[/quote] 我上面说了的 ([0-9]) 捕获组,自动分配组号1
zhjdg 2014-01-12
  • 打赏
  • 举报
回复
这个说错了 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符合。
zhjdg 2014-01-12
  • 打赏
  • 举报
回复
456260 4 .*?\1 (56260)是.*? 没有是\1 否定符合 $ 不是结尾 45 .*?\1 (6260)是.*? 没有是\1 否定符合 $ 不是结尾 456 .*?\1 (2)是.*? 6是\1 否定不符合
zhjdg 2014-01-12
  • 打赏
  • 举报
回复
今天给个正确答复给你。 首先,明确一下(?!.*?\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符合。
一直不懂 2014-01-12
  • 打赏
  • 举报
回复
引用 8 楼 thy442030800 的回复:
看懂这个用法就明了了: (a)(?!.*?\1) 表示在该字符串中 a的后面不会重复出现a 又加了一个(?:)+用来重复检查最终确保整个字符串中不会出现重复字符
\1是引用哪个括号里的内容呢?
zhjdg 2014-01-10
  • 打赏
  • 举报
回复
误导了楼主, 帮你顶顶。
$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);
thy442030800 2014-01-10
  • 打赏
  • 举报
回复
看懂这个用法就明了了: (a)(?!.*?\1) 表示在该字符串中 a的后面不会重复出现a 又加了一个(?:)+用来重复检查最终确保整个字符串中不会出现重复字符
thy442030800 2014-01-10
  • 打赏
  • 举报
回复
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 但是因为加了零宽断言?!,显然,作用就是用来匹配字符串中不会有重复字符出现。 (所以这里用贪婪或懒惰都行,效果都一样)
一直不懂 2014-01-09
  • 打赏
  • 举报
回复
引用 4 楼 u011461314 的回复:
第二个错的,没注意开始一定是数字。
没看懂啊
zhjdg 2014-01-09
  • 打赏
  • 举报
回复
第二个错的,没注意开始一定是数字。
一直不懂 2014-01-09
  • 打赏
  • 举报
回复
引用 1 楼 u011461314 的回复:
(?!.*?\1) 不是不允许后面有重复的数字。 ?!.*? 非.*? . 匹配除换行符以外的任意字符 也就是说,后面可以是换行。
(?!pattern) 负向预查,和你说的是一回是吗?能详细解答一下吗
zhjdg 2014-01-09
  • 打赏
  • 举报
回复
309 09 09 xxde4903 903 903
zhjdg 2014-01-09
  • 打赏
  • 举报
回复
(?!.*?\1) 不是不允许后面有重复的数字。 ?!.*? 非.*? . 匹配除换行符以外的任意字符 也就是说,后面可以是换行。

87,922

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧