首先,要明确一点,所有的正则表达式都有一个lastIndex属性,用于记录上一次匹配结束的位置。如果不是全局匹配模式,那lastIndex的值始终为0,在匹配过一次后,将会停止匹配。

正则表达式的全局匹配模式,就是在创建正则表达式的时候使用g标识符或者将global属性设置为true,在全局匹配模式下,正则表达式会对指定要查找的字符串执行多次匹配。每次匹配使用当前正则对象的lastIndex属性的值作为在目标字符串中开始查找的起始位置。如果找不到匹配的项lastIndex的值会被重新设置为0

理解了上面的话,下面代码的结果就很清晰了:

var regex = /abc/g;
var str = '123#abc';
console.log(regex.lastIndex);   // 0
console.log(regex.test(str));   // true
console.log(regex.lastIndex);   // 7
console.log(regex.test(str));   // false
console.log(regex.lastIndex);   // 0
console.log(regex.test(str));   // true
console.log(regex.lastIndex);   // 7
console.log(regex.test(str));   // false

今天在写表单验证的时候遇到一个问题,每当偶数次点击的时候就会报错,就是这个问题造成的,解决方法也很简单,就是去掉正则表达式里面的g

关于RegExp.prototype.exec(str)方法和String.prototype.math(rgExp)方法:

RegExp.prototype.exec(str)方法返回NULL或返会一个数组,在数组的第0个元素存放的是在字符串str中查找到的匹配内容,1n个元素返回的是在模式中使用括号"()"指定的子匹配项的内容。

在没有使用全局标志时String.prototype.math(rgExp)方法和RegExp.prototype.exec(str)的行为类似。当设置了全局匹配标志时String.prototype.math(rgExp)方法返回的数组项元素0n中包含了所有匹配到的项不包含子匹配项。这时可以使用RegExp.$1..$9获取9个子匹配。


js正则表达式test()方法

test()方法是正则表达式的一个方法,用于检测一个字符串是否匹配某个模式.
test方法检查字符串是否与给出的正则表达式模式相匹配,如果是则返回 true,否则就返回 false

每个正则表达式都有一个lastIndex属性,用于记录上一次匹配结束的位置.

语法:regexp.test(str)

在全局匹配模式下

对于同一个正则对象重复调用就会出现下一次的匹配位置从上一次匹配结束的位置开始,解决方法重置lastIndex0

let reg = /^[\d]{2}$/g;let str = "12";console.log(reg.test(str));     //返回truelet = "123";console.log(reg.test(str));     //从数字3开始匹配,只有一个数字,故返回false

重置lastIndex0

 let reg = /^[\d]{2}$/g;let str = "12";console.log(reg.test(str));     //返回truelet = "123";reg.lastIndex = 0;console.log(reg.test(str));     //返回true

在非全局匹配模式下,则不存在这个问题

let reg = /^[\d]{2}$/;let str = "12";console.log(reg.test(str));     //返回truelet = "123";console.log(reg.test(str));     //返回true

另外,test()方法和数组的forEach()方法一起使用可能达不到预期结果,在for循环下,同样如此,如下

let line = '1a 123 123 12';
let lines = line.split(' ');
let reg = /^[\d]+$/g;
let res = 0;
lines.forEach( function(element, index) {console.log(reg.test(element));  // flase true 交替出现
});

使用forEach方法对数组中字符串进行test测试,会出现flase true 交替出现的现象,先出现false还是true则取决数组第一个元素匹配的结果。

同样的,在非全局匹配模式下,则不存在这个问题,这里去掉全局匹配g才可得到预期结果

let line = '1a 123 123 12'let lines = line.split(' ');let reg = /^[\d]+$/;let res = 0;lines.forEach( function(element, index) {console.log(reg.test(element));      // false true true true});

正则表达式的全局匹配模式相关推荐

  1. Javascript中正则表达式的全局匹配模式

    先看一道JavaScript题目,据说是国内某知名互联网企业的JavaScript笔试题,如果对正则的全局匹配模式不了解的话可能会对下面的输出结果感到疑惑. View Code var str = & ...

  2. java中正则全局匹配_JS中正则表达式全局匹配模式/g用法实例

    JS中正则表达式全局匹配模式 /g用法详解 本文章来详细介绍js中正则表达式的全局匹配模式 /g用法, var str = "123#abc"; var re = /abc/ig; ...

  3. java正则全局匹配_正则表达式全局匹配模式(g修饰符)

    正则表达式g修饰符: g修饰符用语规定正则表达式执行全局匹配,也就是在找到第一个匹配之后仍然会继续查找. 语法结构: 构造函数方式: new RegExp("regexp",&qu ...

  4. 正则表达式三种匹配模式:贪婪模式,勉强模式,占有模式的区别

    正则表达式一共有三种模式:贪婪模式.勉强模式.侵占模式. 我在做项目的时候,曾领教过正则"回溯陷阱"的厉害,所以,今天做个总结下正则常见的两种模式的区别: [贪婪模式]:正则表达式 ...

  5. php正则表达式如何找到匹配模式中的最后一组

    转载于:https://www.cnblogs.com/MyFlora/archive/2013/06/07/3124073.html

  6. JS:正则表达式中的替换 replace(内容包含匹配模式)

    replace()方法可以实现替换字符的操作,用来替换的参数可以是字符串或正则表达式. 语法格式: // 第一个参数:被替换的可以是字符串也可以是正则表达式 // 第二个参数:替换为新的字符串 // ...

  7. 正则表达式全局匹配g的注意点

    正则表达式 g 全局匹配的弄巧成拙 当我们写好匹配规则后,利用test()进行验证时,你会发现第一次匹配出现为 true ,第二次就是 false,之后反复. 例如下面的情况 我们从正则表达式的使用方 ...

  8. 【Python3 爬虫】09_正则表达式(re.math()、re.search()、re.sub()、全局匹配函数)

    re.math()函数 从源字符串的起始位置匹配一个模式 语法:re.match(pattern, string, flag) 第一个参数代表对应的正则表达式,第二个参数代表对应的源字符,第三个参数是 ...

  9. 【超详总结/理解:正则表达式】特点/元字符/正则表达式中的标志位-flag/RegExp/重复操作与后向引用/匹配模式/表达邮箱/正则表达式对象的方法/利用正则表达式限制网页表单里的文本框输入内容

    文章目录 正则表达式: 正则表达式的用途 正则表达式的组成-元字符 正则表达式的特点 正则表达式中的标志位-flag JavaScript中的正则表达式解析 RegExp 定义 RegExp RegE ...

最新文章

  1. 在 Visual Basic .NET 或 JScript 代码中使用早期绑定
  2. Kubernetes的十大使用技巧
  3. gdb调试多进程和多线程命令 .
  4. 【译】 WebSocket 协议第六章——发送与接收消息(Sending and Receiving Data)
  5. 不爱沟通的人可以做产品经理嘛?
  6. asp.net membership 配置错误
  7. row_number()分页返回结果顺序不确定
  8. Video Target Tracking Based on Online Learning—TLD多目标跟踪算法
  9. RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)
  10. Android源码:1、如何下载源码详解(一)
  11. c语言中结构体习题,C语言之结构体练习题
  12. 51单片机原理以及接口技术(四)--80C51的程序设计
  13. Redis雪崩和Redis穿透
  14. 七个关键心理学(2)损失厌恶
  15. 防止按钮在短时间内被多次点击多次触发事件
  16. Excel函数完整列表(Excel Function Full List)
  17. JAVA开发中常见问题
  18. 关于将LIUNX下的图形化操作倾向WINDOWS的几个东西
  19. 如何使用hugo搭建个人博客(五):添加站内搜索(gcse)
  20. 中职双师型教师计算机培训总结,双师型教师计算机培训心得体会

热门文章

  1. Cassandra在海量数据存储及大型项目案例介绍-part2
  2. 电子商务若干关键问题的分析
  3. ECharts position属性设置(外部、内部、自定义位置)
  4. centos中用C/C++语言连接MySQL/MariaDB数据库
  5. 开放windows服务器端口---以打开端口8080为例
  6. 网络安全系列连载(1)到底什么是数字证书
  7. JAVA类加载与初始化顺序
  8. 电影优美语句分享(英与汉)
  9. 【转帖】每一个不懂爱的人都会遇到一个懂爱的人,然后经历一场撕心裂肺的爱情。不懂爱的人慢慢懂了。懂爱的人,却不敢再爱了。。。
  10. 用英文帮我写一篇关于vintage stationery papers 的listing,包括标题,五点描述,长描述,以及关键词...