首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 想和大家讨论一正则,请进来看一!! [已结贴,结贴人:renqiang_888]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-19 13:58:38 楼主
    正向预搜索:"(?=xxxxx)"
    格式:"(?=xxxxx)",在被匹配的字符串中,它对所处的 "缝隙" 或者 "两头" 附加的条件是:所在缝隙的右侧,必须能够匹配上 xxxxx 这部分的表达式。因为它只是在此作为这个缝隙上附加的条件,所以它并不影响后边的表达式去真正匹配这个缝隙之后的字符。
      举例1:表达式 "Windows (?=NT ¦XP)" 在匹配 "Windows 98, Windows NT, Windows 2000" 时,将只匹配 "Windows NT" 中的 "Windows ",其他的 "Windows " 字样则不被匹配。
    2000(?=xp)window  不能匹配: 2000xpwindow

    我的问题是,如下:
    此时(?=xp)所处的"缝隙"应当是2000和xp之间,而所在缝隙的右侧xp以匹配(?=xp),2000(?=xp)window  不能匹配: 2000xpwindow 为什么呢?难道意着"正向预搜索:(?=xxxxx)"只能放在正则表达式最后面配合使用.
    有没有朋友用过:"正向预搜索:(?=xxxxx)"放在正则表达式前面(如:(?=xx)abc)去匹配的例子,拿出来看一下,在下将不胜感激
    .
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-19 15:26:311楼 得分:0
    看看
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-19 16:33:012楼 得分:0
    引用 1 楼 ws_hgo 的回复:
    看看
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bhtfg538
    • 等级:
    发表于:2008-07-19 16:55:013楼 得分:0
    (?=xx)abc)
    不能这样写  (? <=xx)abc)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bhtfg538
    • 等级:
    发表于:2008-07-19 16:58:234楼 得分:0
    js 不支持反向搜索
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bhtfg538
    • 等级:
    发表于:2008-07-19 17:05:495楼 得分:0
    (? <=2000)xp(?=window)
    就能匹配 xp
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bhtfg538
    • 等级:
    发表于:2008-07-19 17:07:006楼 得分:0
    因为(?=xx)abc) 搜索到 xxabc 如果判断?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bhtfg538
    • 等级:
    发表于:2008-07-19 17:10:257楼 得分:0
    但是
    (?=2000xp)(\d+)
    会匹配 2000
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bhtfg538
    • 等级:
    发表于:2008-07-19 17:11:568楼 得分:0
    引用 7 楼 bhtfg538 的回复:
    但是
    (?=2000xp)(\d+)
    会匹配 2000

    (?=2000xp)这就代表一个缝隙
    然后 捕获到了 2000xp 然后\d+把2000保存成了结果
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bhtfg538
    • 等级:
    发表于:2008-07-19 17:13:209楼 得分:0
    Windows (?=NT ¦XP)(NT)
    就能 匹配 Windows NT
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bhtfg538
    • 等级:
    发表于:2008-07-19 17:14:3310楼 得分:0
    LZ 理解了  (?=)是不占位置的
    正向搜索到了 NT以后然后如果再有NT就匹配下一个 (NT)就是 windows NT
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bhtfg538
    • 等级:
    发表于:2008-07-19 17:18:0611楼 得分:0
    2000(?=xp)window
    永远都匹配不到
    因为 xp不可能 =window
    xp 就当不存在 但是 匹配项需要xp
    如果是 2000(?=xp)(x)
    就能匹配到了 2000x
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-19 19:13:0412楼 得分:0
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-19 21:05:4313楼 得分:0
    一人可以占9楼 好强
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-19 21:12:5014楼 得分:0
    呵呵,11楼终于说到点上了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bhtfg538
    • 等级:
    发表于:2008-07-20 00:17:2915楼 得分:0
    引用 12 楼 renqiang_888 的回复:


    你少了最开始的 \w
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-20 07:48:4316楼 得分:0
    我少了最开始的 \w?什么意思啊?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bhtfg538
    • 等级:
    发表于:2008-07-20 08:36:0817楼 得分:10
    最开始匹配以个 a 后面有3种情况
    分别匹配2个啊
    最后一次匹配不到
    所以就是3个a
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-20 09:03:4918楼 得分:0

    第一次匹配:\w和第1个A匹配,最后一个\1和第二个A匹配,
    此时引擎必须从第三个A开始匹配了,看第三个A后面是不是有三个连续的A,结果只有两个,你的意思是此时,\w匹配了第三个A对吗?
    那上不可能的,因为你看到最后那个加号了吧,被匹配的字符串必须是四个连续的\w才可以,第三个A后面只有两个,一共才三个连续的啊?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-20 09:47:4719楼 得分:10
    由于+对应贪婪匹配,所以\w匹配第一个A

    ((?=\1\1\1)\1)+  匹配 第二和第三个A
    分析如下:
    引擎处于第一个A之后,看到后面有三个A,(?=\1\1\1)满足,((?=\1\1\1)\1)+成功匹配第二个A
    由于+对应贪婪匹配,引擎将继续用((?=\1\1\1)\1)+匹配字符串,这样得到第三个A,最后匹配失败,
    因此((?=\1\1\1)\1)+ 匹配 第二和第三个A

    最后 /(\w)((?=\1\1\1)\1)+/ 匹配 "AAAAA" 中的前三个A

    可以推断,/(\w)((?=\1\1\1)\1)+/ 匹配 A^n (n>3) 中的前 n-2 个A

    引用 18 楼 renqiang_888 的回复:

    第一次匹配:\w和第1个A匹配,最后一个\1和第二个A匹配,
    此时引擎必须从第三个A开始匹配了,看第三个A后面是不是有三个连续的A,结果只有两个,你的意思是此时,\w匹配了第三个A对吗?
    那上不可能的,因为你看到最后那个加号了吧,被匹配的字符串必须是四个连续的\w才可以,第三个A后面只有两个,一共才三个连续的啊?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-20 09:49:5220楼 得分:0
    其实,17楼已经解释了,呵呵
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-20 10:49:3021楼 得分:0
    平时一看到?=和?!这些就怕怕想避开,以后多向大家学习。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-20 13:12:4422楼 得分:0

    说得有道理:

    也有道理:
    每人十分,哈哈,结贴.谢谢二位达人.
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved