iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >JavaScript正则表达式使用实例分析
  • 841
分享到

JavaScript正则表达式使用实例分析

2023-06-30 07:06:57 841人浏览 泡泡鱼
摘要

本篇内容主要讲解“javascript正则表达式使用实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript正则表达式使用实例分析”吧!背景我有一个node服务,希望对访问进来

本篇内容主要讲解“javascript正则表达式使用实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript正则表达式使用实例分析”吧!

背景

我有一个node服务,希望对访问进来的请求进行标记,如果请求进来的path是我定义的路由,那么将标记一个REQ,否则标记一个IVL,用于对于整个服务的日志记录进行输出。那么我通过服务启动时,根据定义的路由,生成一个RouterMap,通过访问进入时,判断path是否命中RouterMap来判断是否预期访问。

大概的代码如下:

export function getSourceMak(  routerMap: AppRouterMap[],  req: Http.IncomingMessage,): SourceMark.REQ | SourceMark.IVL | SourceMark.TST {  const { url, method, headers } = req;  const pathname = url.split('?')[0];  const userAgent = headers['user-agent'];  // 安全扫描  if (userAgent?.includes('TST(Tencent') && userAgent.includes('Team)')) {    return SourceMark.TST;  }  for (const item of routerMap) {    const { reg } = item;    if (reg.test(pathname) && item.method === method.toLocaleLowerCase()) {      return SourceMark.REQ;    }  }  return SourceMark.IVL;}

因为涉及到一些动态路由的原因,不能直接通过path进行相等判断,需要对相应的路由规则生成一个对应的正则表达式,并且在服务启动时生成,保存在内存中进行复用。

生成正常代码如下:

export function createRouterRegexp(url) {  const urlBlock = url.split('/');  const regBlock = urlBlock.map((block) => {    if (block[0] === ':') {      return '((?!/).)*';    }    return block;  });  return new RegExp(`^${regBlock.join('/')}$`, 'ig');}

问题

然后在进行调试的时候发现一个奇怪的现象,假设我有一个路由为GET /cats/find的路由,通过打点发现对应的正则表达式,/^\/cats\/find$/gi对/cats/find进行匹配的时候,第一次为true,第二次为false,第三次为true,第四次为false,以此类推。

经过反复验证,node代码并没有存在问题,正则表达式也没有问题,那么我在浏览器中尝试复现一下,也是得出同样的问题。至此我很确定,一定是有一些正则相关的坑是我以前没有注意到。于是我反查了一下JavaScript的文档,终于被我找到原因。

JavaScript正则表达式使用实例分析

原因

通过查找MDN正则相关的文档,被查到以下说明

"nolink">当设置全局标志的正则使用test()

如果正则表达式设置了全局标志,test() 的执行会改变正则表达式 lastIndex属性。连续的执行test()方法,后续的执行将会从 lastIndex 处开始匹配字符串,(exec() 同样改变正则本身的 lastIndex属性值).

下面的实例表现了这种行为:

var regex = /foo/g; // regex.lastIndex is at 0 regex.test('foo'); // true // regex.lastIndex is now at 3 regex.test('foo'); // false

RegExp.prototype.test() - JavaScript | MDN

这不就是我遇到的问题吗?

通过文档说明得知,当我们正则表达式带有g标识进行全局匹配时,匹配成功后,regex实例中会有一个lastIndex属性去记录本次命中正则的最后一位的下标+1,用于在下一次调用test的时候,从lastIndex开始进行匹配。 以前我没有遇到过大概率是因为以下原因:

每次进行正则校验时,都重新生成正则实例:/^\/cats\/find$/gi.test('/cats/find') 。

JavaScript正则表达式使用实例分析

但是因为这次我将正则实例保存,并反复使用。从而导致问题。

并且通过验证得出,当匹配成功后,lastIndex会记录下一次开始的位置,但是当匹配失败,lastIndex会归零从头开始。

JavaScript正则表达式使用实例分析

至此这一次被坑经历耗时60分钟左右,耽误了吃饭最佳时间,导致饭堂菜都快没有。但是同时也收获到JavaScript在正则上一个容易被忽略的坑。好像也不亏。

到此,相信大家对“JavaScript正则表达式使用实例分析”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: JavaScript正则表达式使用实例分析

本文链接: https://www.lsjlt.com/news/327688.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript正则表达式使用实例分析
    本篇内容主要讲解“JavaScript正则表达式使用实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript正则表达式使用实例分析”吧!背景我有一个Node服务,希望对访问进来...
    99+
    2023-06-30
  • JavaScript正则表达式实例分析
    这篇文章主要讲解了“JavaScript正则表达式实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript正则表达式实例分析”吧!1. 概...
    99+
    2024-04-02
  • Java正则表达式使用实例分析
    这篇文章主要介绍“Java正则表达式使用实例分析”,在日常操作中,相信很多人在Java正则表达式使用实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java正则表达式使用实例分析”的疑惑有所帮助!接下来...
    99+
    2023-06-29
  • Python正则表达式使用实例分析
    这篇文章主要介绍“Python正则表达式使用实例分析”,在日常操作中,相信很多人在Python正则表达式使用实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python正则表达式使用实例分析”的疑惑有所...
    99+
    2023-06-08
  • JavaScript正则表达式的示例分析
    这篇文章主要为大家展示了“JavaScript正则表达式的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript正则表达式的示例分析”这篇文...
    99+
    2024-04-02
  • Python正则表达式实例分析
    这篇“Python正则表达式实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python正则表达式实例分析”文章吧。一...
    99+
    2023-06-29
  • Javascript常用正则表达式的示例分析
    小编给大家分享一下Javascript常用正则表达式的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!模式修饰符的可选参数...
    99+
    2024-04-02
  • JavaScript正则表达式中g标志实例分析
    本篇内容主要讲解“JavaScript正则表达式中g标志实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript正则表达式中g标志实例分析”吧!有一天在思否社区看到有个问题,大...
    99+
    2023-06-29
  • Linux的正则表达式实例分析
    今天小编给大家分享一下Linux的正则表达式实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。正则表达式(regular...
    99+
    2023-06-27
  • javascript正则表达式的使用示例
    这篇文章给大家分享的是有关javascript正则表达式的使用示例的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。JavaScript是什么JavaScript是一种直译式的脚本语言,其解释器被称为JavaScri...
    99+
    2023-06-14
  • Go语言正则表达式实例分析
    这篇文章主要介绍了Go语言正则表达式实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言正则表达式实例分析文章都会有所收获,下面我们一起来看看吧。前言在计算中,我们经常需要将特定模式的字符或字符子集匹...
    99+
    2023-06-30
  • VB.NET正则表达式的示例分析
    小编给大家分享一下VB.NET正则表达式的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.选择符 VB.NET正则表达式中“ ¦”...
    99+
    2023-06-17
  • jmeter正则表达式的示例分析
    小编给大家分享一下jmeter正则表达式的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!使用jmeter时经常有这样的情况:一个完整的操作流程,需先完成某个操作,获得某个值或数据信息,然后才能进行下一步的操作(也就...
    99+
    2023-06-14
  • 正则表达式组的示例分析
    这篇文章主要为大家展示了“正则表达式组的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“正则表达式组的示例分析”这篇文章吧。正则表达式组的理解把正则表达式的一部分放在圆括号内,你可以将它们...
    99+
    2023-06-17
  • mysql正则表达式的案例分析
    小编给大家分享一下mysql正则表达式的案例分析,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!MySQL支持基于正则表达式和REGEXP运算符的另一种模式匹配操作。1.它提供了强大而灵活的模式...
    99+
    2024-04-02
  • javascript中正则表达式分组、断言的示例分析
    这篇文章主要为大家展示了“javascript中正则表达式分组、断言的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“javascript中正则表达式分组...
    99+
    2024-04-02
  • Python之正则表达式常用语法实例分析
    正则表达式概述正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。 Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。 re 模块使 Python 语言拥有全部的正则表达式功...
    99+
    2023-05-14
    Python
  • C#正则表达式使用源码分析
    这篇文章主要介绍了C#正则表达式使用源码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#正则表达式使用源码分析文章都会有所收获,下面我们一起来看看吧。文章导读正则表达式的本质是使用一系列特殊字符模式,来表...
    99+
    2023-07-05
  • shell中正则表达式的示例分析
    这篇文章给大家分享的是有关shell中正则表达式的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。正则表达式匹配中文字符的正则表达式:[u4e00-u9fa5]评注:匹配中...
    99+
    2024-04-02
  • 怎么使用javascript正则表达式
    本篇内容介绍了“怎么使用javascript正则表达式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!表单验...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作