最近在公司用Javascript实现前端QuickSearch功能,偶尔触及RegExp对象的test()方法。大致有类似的代码:

var texts = ["item1", "item2", "item3", "item4", "item5", "item6"];var pattern = new RegExp("it", "ig");function check() {  var len = texts.length, text, isMatched = false;  for(var i = 0; i < len; i++){    text = texts[i];    isMatched = pattern.test(text);

    console.error(text + ": " + isMatched);  }}

其结果甚是诡异,把爹坑得郁闷不已。

百思不得其解之下,只好借助网络。终于,在w3schools中找到了问题的关键所在。

原来,RegExp的对象有一个很NB的lastIndex属性,当我们调用方法 exec() 或 test()时,RegExp对象会用它来记录最近一次成功匹配后的位置,并将其作为下一次检索的起始点。只有当方法 exec() 或 test() 再也找不到可以匹配的文本时,它们会自动把 lastIndex 属性重置为 0。

var texts = ["item1", "item2", "item3", "item4", "item5", "item6"];var pattern = new RegExp("it", "ig");function check() {    var len = texts.length, text, isMatched = false;    for(var i = 0; i < len; i++){        text = texts[i];

        var result = "LastIndex: " + pattern.lastIndex;        isMatched = pattern.test(text);        result = result + " " + text + ": " + isMatched;        console.error(result);    }}

如此,在"item2", "item4", "item6"中从索引位置2开始检索关键字“it”,当然是找不到的了。因为对同一个RegExp对象而言,“终点即起点,执着何用。”显然,我们需要从头开始,从0开始。我们需要在做完一次exec() 或 test()后手动将lastIndex重新设置为0。例如:

var texts = ["item1", "item2", "item3", "item4", "item5", "item6"];var pattern = new RegExp("it", "ig");function check() {var len = texts.length, text, isMatched = false;for(var i = 0; i < len; i++){        text = texts[i];

var result = "LastIndex: " + pattern.lastIndex;        isMatched = pattern.test(text);        result = result + " " + text + ": " + isMatched;        console.error(result);

        pattern.lastIndex = 0;    }}

惟有如此,事可成也。

其实所谓“坑爹”之说,不过是遇事未能详查,徒添困扰罢了。w3schools在对RegExp的lastIndex进行解说时早已明确写明:

提示和注释
重要事项:不具有标志 g 和不表示全局模式的 RegExp 对象不能使用 lastIndex 属性。提示:如果在成功地匹配了某个字符串之后就开始检索另一个新的字符串,需要手动地把这个属性设置为 0。

今记录于此,以鉴后来之事。

  

转载于:https://www.cnblogs.com/iter/archive/2011/10/24/2222787.html

坑爹的RegExp test()相关推荐

  1. JavaScript正则表达式----RegExp类型, 代码说明简单易懂

    RegExp 正则表达式定义 RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具.匹配原则: 贪婪匹配 直接量语法 /pattern(匹配规则)/attributes(属性) 创建 ...

  2. mysql中正则表达式的用法_Mysql中正则表达式Regexp常见用法

    Mysql中Regexp常见用法 模糊匹配,包含特定字符串 # 查找content字段中包含"车友俱乐部"的记录 select * from club_content where ...

  3. php sql中regexp,[NCTF2019]SQLi(regexp注入)

    主页就一个登录框 .把sql语句显示出来了. 再进行一波信息搜集.看看robots.txt 有个hint.txt $black_list = "/limit|by|substr|mid|,| ...

  4. unity中使用自定义shader进行光照贴图烘培无法出现透明度的坑爹问题

    最近开发中在对场景进行光照贴图烘焙时发现一个坑爹问题,在使用自定义shader的时候,shader命名中必须包含Transparent路径,否则烘焙的时候不对alpha通道进行计算,烘焙出来都是狗皮膏 ...

  5. 坑爹的微软官方文档:SQL无人值守安装

    我在部署项目的时候,需要用批处理无人值守安装SQLserver,.Net等组件. 于是查了微软官方文档,其中一项内容如下: http://msdn.microsoft.com/zh-cn/librar ...

  6. javascript里面RegExp的exec函数的总结

    2019独角兽企业重金招聘Python工程师标准>>> 在我们的前端里面,经常会用到正则表达式进行检索字符串,刚好javascript里面提供RegExp来支持正则表达式,而RegE ...

  7. regexp 好汉字符串_如何在JavaScript中使用RegExp确认字符串的结尾

    regexp 好汉字符串 by Catherine Vassant (aka Codingk8) 由凯瑟琳·瓦森(Catherine Vassant)(又名Codingk8) 如何在JavaScrip ...

  8. javascript RegExp

    http://www.w3schools.com/jsref/jsref_obj_regexp.asp 声明------------- modifiers:{i,g,m} 1.     var pat ...

  9. RegExp 正则

    正则:就是一条规则,用于检验字符串的格式,目标就是字符串. 只要是表单提交的数据都是字符串 正则的定义: 1.var  reg=new RegExp(): 2.var reg=/格式/: 正则的方法: ...

  10. 【星榜单】盘点那些坑爹的国产手机们

    [星榜单]盘点那些坑爹的国产手机们 国产手机的那些坑爹事儿很多,中庸到基本大众脸的设计还算是有点良心的,那些奇葩的名字.所谓的高配低价低却又山寨级的做工.饥饿营销让你看得到买不到.伪小清新却又华而不实 ...

最新文章

  1. centos php sftp 扩展,Linux(CentOS)上配置 SFTP
  2. ubuntu 安装 talib
  3. 4、CSS 高级语法
  4. 《游戏编程入门 4th》笔记(2 / 14):监听Windows消息
  5. NYOJ-摆方格(贪心)
  6. 【转载】推荐系统的十大挑战
  7. HttpComponents HttpCore 4.3 Alpha1 发布
  8. 考研计算机专业课961考什么,北航计算机考研(961)经验谈
  9. 英语邮件中常用的礼貌用语
  10. 论文解读:FASPell: A Fast, Adaptable, Simple, Powerful Chinese Spell Checker Based On DAE-Decoder Paradig
  11. javascript封装滑块
  12. 给开发兄弟上难度,一周内上线likeadmin的官网
  13. android 桌面快捷方式静态shortcuts异常
  14. Mapper 接口的如何起作用
  15. php 一键登录插件,帝国CMS一键登录插件(带后台管理)
  16. DenseCLIP:Language-Guided Dense Prediction with Context-Aware Prompting
  17. Python Matplotlib画图基础介绍
  18. 8弦金属摇滚电吉他音源 Orange Tree Samples Evolution Dracus Kontakt
  19. 海信电视直播显示服务器连接超时,【当贝市场】海信电视多屏互动连接超时怎么办?...
  20. web前端-JS入门

热门文章

  1. Note for Multi Agent Teamwork—A Survey
  2. Dynamic programming
  3. DeskFX for Mac(音频增强软件) 适配M1芯片
  4. Check $M2_HOME environment variable and mvn script
  5. 云视频会议对初创公司的益处
  6. Qt5 QtQuick系列----QtQuick的Secne Graph剖析(1)
  7. zabbix被监控端口的简单部署
  8. Centos6.7 64位安装配置kvm虚拟化
  9. vscode初次配置
  10. centos-rpm