当前位置: 首页 > 知识库问答 >
问题:

javascript - js 正则匹配问题?

汲时铭
2024-02-01
let str = /街|道|中/g    console.log(RegExp(str).test('道路'),RegExp(str).test('中'));//true false    console.log(RegExp(str).test('道路'),RegExp(/街|道|中/g).test('中'));//true true

这是什么原理

共有1个答案

苏骏
2024-02-01

在JavaScript中,RegExp对象可以接受一个字符串作为参数来创建一个新的正则表达式实例。然而,在你给出的例子中,存在对正则表达式的误解。

第一部分:

let str = /街|道|中/g;console.log(RegExp(str).test('道路')); // trueconsole.log(RegExp(str).test('中'));   // false

这里,str 已经是一个正则表达式实例( /街|道|中/g ),它表示匹配“街”、“道”或“中”中的任意一个,并且是全局搜索(g 标志)。当你用 RegExp(str) 创建一个新的正则表达式时,实际上是对已经存在的正则表达式进行了一次不必要的包装。

由于正则表达式 /街|道|中/g 中的 g 标志意味着在执行 .test() 方法时会从当前位置开始查找匹配项,而不会重置为字符串的起始位置。所以第二次调用 test('中') 时,因为上一次匹配了 "道",下一次查找的位置不是字符串的起始位置,因此返回 false。

第二部分:

console.log(RegExp(str).test('道路')); // trueconsole.log(/街|道|中/g.test('中'));   // true

这次第二个测试语句直接使用了原始的正则表达式 /街|道|中/g 来执行 .test('中'),每次 .test() 都会从字符串的起始位置开始查找,所以即使在之前的查找中匹配过其他字符,再次查找仍能正确匹配到 "中" 字符,因此返回 true。

总的来说,问题出在对正则表达式的连续测试以及全局标志 (g) 导致的 lastIndex 状态改变上。在实际应用中,通常不需要对已有的正则表达式实例再用 RegExp() 包装一次。

 类似资料:
  • 老师们怎么将这两个正则表达式合并成一个, 既能检查IPV4又能检查IPV6地址? 仅匹配ipv4或ipv6匹配都是正常的。 搞了好久搞不出来了... 请老师们指点一下。

  • /^(?=^.{3,255}$)(http(s)?:\/\/|ftp:\/\/)?(www\.)?[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+(:\d+)*(\/\w+\.\w+)*$/ 如何修改下这个正则 能匹配到地址栏上的参数,可有可无 匹配如http://www.baidu.com?params1=123&pa

  • 我想匹配一段字符串中所有的input 并使用replace进行替换,如果input里面有类似data-* 这种自定义属性的就跳过 不知道这种正则该怎么写,我也阅读了文档并使用google。都没找到 比如 <input type='text' /> 这种Input就匹配,<input data-xxx /> 带有自定义属性的input 正则则不匹配

  • 基本模式匹配 一切从最基本的开始。模式,是正则表达式最基本的元素,它们是一组描述字符串特征的字符。模式可以很简单,由普通的字符串组成,也可以非常复杂,往往用特殊的字符表示一个范围内的字符、重复出现,或表示上下文。例如: ^once 这个模式包含一个特殊的字符^,表示该模式只匹配那些以once开头的字符串。例如该模式与字符串"once upon a time"匹配,与"There once was

  • 本文向大家介绍javascript匹配js中注释的正则表达式代码,包括了javascript匹配js中注释的正则表达式代码的使用技巧和注意事项,需要的朋友参考一下 有时候我们需要将js的注释去掉,减少代码中的冗余,有时候注释太多导致页面体积大。 注释图示如下: 一.匹配多行注释正则表达式: 二.单行注释正则表达式: 以上内容介绍到这了,希望大家以后多多支持呐喊教程。

  • 给定下面的字符串 [NeMo(PROD)]10.10.100.100(EFA-B-3)[博科FC-Switch]传感器:电源#1(SNMP自定义表)关闭(无此名称(SNMP错误#2)) 我尝试获取多个匹配项以提取以下值: 因为我是正则表达式的初学者,所以我试图定义一些“规则”: 提取第一个圆括号内的第一个值,例如PROD 提取第一个闭合方括号和第二个开口圆括号之间的值,例如10.10.100.10