js正则表达式test方法的问题

2024-09-08 04:32

本文主要是介绍js正则表达式test方法的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天在网上碰到一个帖子,写了一个关于Regex的奇怪现象,(文章来源http://www.php100.com/html/webkaifa/javascript/2007/0109/1866.html)

代码如下

<script type="text/javascript">
<!--
var re = /^\d+(?:\.\d)?$/ig;   alert(re.test('112.3'));
alert(re.test('112.3'));
//-->
</script>
执行发现2行输出结果不一样,第一个是true,第二个是false

文章给的建议是每次都重新创建re对象

......
alert(/^\d+(?:\.\d)?$/ig.test('112.3'));
alert(/^\d+(?:\.\d)?$/ig.test('112.3'));
......
这下2个都是true了,但是为什么呢?

文字结尾一段英文回复,着重说了lastIndex 的作用,可能回复者想说明这种问题的原因是lastIndex 导致的,于是我把代码改成以下样子

......
alert(re.lastIndex);//0
alert(re.test('112.3'));//true
alert(re.lastIndex);//5
re.lastIndex = 0;
alert(re.test('112.3'));//true
......
果然是因为lastIndex 被修改造成的,那为什么lastIndex 改过去之后在下一次test之前不重置成0呢?

经过多次测试,我发现re改成/^\d+(?:\.\d)?$/i都是正常的,即去掉全文搜索,那如果改成/\d+(?:\.\d)?/ig(去掉全字符串匹配限制)呢,结果是这样的

<script type="text/javascript">
<!--
var re = /\d+(?:\.\d)?/ig; 
alert(re.lastIndex);//0
alert(re.test('112.3'));//true
alert(re.lastIndex);//5
alert(re.test('112.3'));//false
alert(re.lastIndex);//0
alert(re.test('112.3'));//true
alert(re.lastIndex);//5
alert(re.test('111112.3'));//true
alert(re.lastIndex);//8
//-->
</script>


总结:

g进行全文搜索,每次test之后会保留下一次查询的位置到lastIndex里,当执行下一次test的时候就会从lastIndex的位置开始,如果匹配到就是true,否则false;

^$限制导致必须整个字符串作为一个整体匹配regex,比如第一次test的是112.3,lastIndex是5,如果第二次test的是1234112.3,虽然匹配到5开始的位置,但是由于是整个字符串限制,所以还是false,这也就解释了为什么去掉^$限制后第二次test变成true了。感觉^$限制和g最好不要一起用,没有意义而且容易造成不好识别的错误





这篇关于js正则表达式test方法的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1147121

相关文章

macOS无效Launchpad图标轻松删除的4 种实用方法

《macOS无效Launchpad图标轻松删除的4种实用方法》mac中不在appstore上下载的应用经常在删除后它的图标还残留在launchpad中,并且长按图标也不会出现删除符号,下面解决这个问... 在 MACOS 上,Launchpad(也就是「启动台」)是一个便捷的 App 启动工具。但有时候,应

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

CentOS 7部署主域名服务器 DNS的方法

《CentOS7部署主域名服务器DNS的方法》文章详细介绍了在CentOS7上部署主域名服务器DNS的步骤,包括安装BIND服务、配置DNS服务、添加域名区域、创建区域文件、配置反向解析、检查配置... 目录1. 安装 BIND 服务和工具2.  配置 BIND 服务3 . 添加你的域名区域配置4.创建区域

mss32.dll文件丢失怎么办? 电脑提示mss32.dll丢失的多种修复方法

《mss32.dll文件丢失怎么办?电脑提示mss32.dll丢失的多种修复方法》最近,很多电脑用户可能遇到了mss32.dll文件丢失的问题,导致一些应用程序无法正常启动,那么,如何修复这个问题呢... 在电脑常年累月的使用过程中,偶尔会遇到一些问题令人头疼。像是某个程序尝试运行时,系统突然弹出一个错误提