javascript基础十九:说说你对正则表达式的理解?应用场景?

news2024/11/16 9:44:46

在这里插入图片描述
一、是什么
正则表达式是一种用来匹配字符串的强有力的武器
它的设计思想是用一种描述性的语言定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的
在 JavaScript中,正则表达式也是对象,构建正则表达式有两种方式:

1.字面量创建,其由包含在斜杠之间的模式组成

const re = /\d+/g;

2.调用RegExp对象的构造函数

const re = new RegExp(“\d+”,“g”);
const rul = “\d+”
const re1 = new RegExp(rul,“g”);

使用构建函数创建,第一个参数可以是一个变量,遇到特殊字符\需要使用\进行转义

二、匹配规则
常见的校验规则如下:
在这里插入图片描述

正则表达式标记
在这里插入图片描述
使用方法如下:

var re = /pattern/flags;
var re = new RegExp(“pattern”, “flags”);

在了解下正则表达式基本的之外,还可以掌握几个正则表达式的特性:

贪婪模式
在了解贪婪模式前,首先举个粟子:

const reg = /ab{1,3}c/

在匹配过程中,尝试可能的顺序是从多往少的方向去尝试。首先会尝试bbb,然后再看整个正则是否能匹配。不能匹配时,吐出一个b,即在bb的基础上,再继续尝试,以此重复

如果多个贪婪量词挨着,则深度优先搜索

const string = "12345";
const regx = /(\d{1,3})(\d{1,3})/;
console.log( string.match(reg) );
// => ["12345", "123", "45", index: 0, input: "12345"]

其中,前面的\d{1,3}匹配的是"123",后面的\d{1,3}匹配的是"45"

懒惰模式
惰性量词就是在贪婪量词后面加个问号。表示尽可能少的匹配

var string = "12345";
var regex = /(\d{1,3}?)(\d{1,3})/;
console.log( string.match(regex) );
// => ["1234", "1", "234", index: 0, input: "12345"]

其中\d{1,3}?只匹配到一个字符"1",而后面的\d{1,3}匹配了"234"

分组

分组主要是用过()进行实现,比如beyond{3},是匹配d字母3次。而(beyond){3}是匹配beyond三次

在()内使用|达到或的效果,如(abc | xxx)可以匹配abc或者xxx

反向引用,巧用$分组捕获

let str = "John Smith";

// 交换名字和姓氏
console.log(str.replace(/(john) (smith)/i, '$2, $1')) // Smith, John

三、匹配方法
正则表达式常被用于某些方法,我们可以分成两类:

  • 字符串(str)方法:match、matchAll、search、replace、split
  • 正则对象下(regexp)的方法:test、exec

在这里插入图片描述
str.match(regexp)

str.match(regexp) 方法在字符串 str 中找到匹配 regexp 的字符

如果 regexp 不带有 g 标记,则它以数组的形式返回第一个匹配项,其中包含分组和属性 index(匹配项的位置)、input(输入字符串,等于 str)

let str = "I love JavaScript";

let result = str.match(/Java(Script)/);

console.log( result[0] );     // JavaScript(完全匹配)
console.log( result[1] );     // Script(第一个分组)
console.log( result.length ); // 2

// 其他信息:
console.log( result.index );  // 7(匹配位置)
console.log( result.input );  // I love JavaScript(源字符串)

如果 regexp 带有 g 标记,则它将所有匹配项的数组作为字符串返回,而不包含分组和其他详细信息

let str = "I love JavaScript";

let result = str.match(/Java(Script)/g);

console.log( result[0] ); // JavaScript
console.log( result.length ); // 1

如果没有匹配项,则无论是否带有标记 g ,都将返回 null

let str = "I love JavaScript";

let result = str.match(/HTML/);

console.log(result); // null

str.matchAll(regexp)
返回一个包含所有匹配正则表达式的结果及分组捕获组的迭代器

const regexp = /t(e)(st(\d?))/g;
const str = 'test1test2';

const array = [...str.matchAll(regexp)];

console.log(array[0]);
// expected output: Array ["test1", "e", "st1", "1"]

console.log(array[1]);
// expected output: Array ["test2", "e", "st2", "2"]

str.search(regexp)
返回第一个匹配项的位置,如果未找到,则返回 -1

let str = "A drop of ink may make a million think";

console.log( str.search( /ink/i ) ); // 10(第一个匹配位置)

这里需要注意的是,search 仅查找第一个匹配项

str.replace(regexp)
替换与正则表达式匹配的子串,并返回替换后的字符串。在不设置全局匹配g的时候,只替换第一个匹配成功的字符串片段

const reg1=/javascript/i;
const reg2=/javascript/ig;
console.log('hello Javascript Javascript Javascript'.replace(reg1,'js'));
//hello js Javascript Javascript
console.log('hello Javascript Javascript Javascript'.replace(reg2,'js'));
//hello js js js

str.split(regexp)
使用正则表达式(或子字符串)作为分隔符来分割字符串

console.log(‘12, 34, 56’.split(/,\s*/)) // 数组 [‘12’, ‘34’, ‘56’]

regexp.exec(str)
regexp.exec(str) 方法返回字符串 str 中的 regexp 匹配项,与以前的方法不同,它是在正则表达式而不是字符串上调用的

根据正则表达式是否带有标志 g,它的行为有所不同

如果没有 g,那么 regexp.exec(str) 返回的第一个匹配与 str.match(regexp) 完全相同

如果有标记 g,调用 regexp.exec(str) 会返回第一个匹配项,并将紧随其后的位置保存在属性regexp.lastIndex 中。下一次同样的调用会从位置 regexp.lastIndex 开始搜索,返回下一个匹配项,并将其后的位置保存在 regexp.lastIndex 中


let str = 'More about JavaScript at https://javascript.info';
let regexp = /javascript/ig;

let result;

while (result = regexp.exec(str)) {
  console.log( `Found ${result[0]} at position ${result.index}` );
  // Found JavaScript at position 11
  // Found javascript at position 33
}

regexp.test(str)
查找匹配项,然后返回 true/false 表示是否存在

let str = "I love JavaScript";

// 这两个测试相同
console.log( /love/i.test(str) ); // true

四、应用场景
通过上面的学习,我们对正则表达式有了一定的了解

下面再来看看正则表达式一些案例场景:

验证QQ合法性(5~15位、全是数字、不以0开头):

const reg = /^[1-9][0-9]{4,14}$/
const isvalid = reg.exec(str)

校验用户账号合法性(只能输入5-20个以字母开头、可带数字、“_”、“.”的字串):

var paten = /^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){4,19}$/
const isvalid = patrn.exec(str)

将url参数解析为对象

const protocol = '(?<protocol>https?:)';
const host = '(?<host>(?<hostname>[^/#?:]+)(?::(?<port>\\d+))?)';
const path = '(?<pathname>(?:\\/[^/#?]+)*\\/?)';
const search = '(?<search>(?:\\?[^#]*)?)';
const hash = '(?<hash>(?:#.*)?)';
const reg = new RegExp(`^${protocol}\/\/${host}${path}${search}${hash}$`);
function execURL(url){
    const result = reg.exec(url);
    if(result){
        result.groups.port = result.groups.port || '';
        return result.groups;
    }
    return {
        protocol:'',host:'',hostname:'',port:'',
        pathname:'',search:'',hash:'',
    };
}

console.log(execURL('https://localhost:8080/?a=b#xxxx'));
protocol: "https:"
host: "localhost:8080"
hostname: "localhost"
port: "8080"
pathname: "/"
search: "?a=b"
hash: "#xxxx"

再将上面的search和hash进行解析

function execUrlParams(str){
    str = str.replace(/^[#?&]/,'');
    const result = {};
    if(!str){ //如果正则可能配到空字符串,极有可能造成死循环,判断很重要
        return result; 
    }
    const reg = /(?:^|&)([^&=]*)=?([^&]*?)(?=&|$)/y
    let exec = reg.exec(str);
    while(exec){
        result[exec[1]] = exec[2];
        exec = reg.exec(str);
    }
    return result;
}
console.log(execUrlParams('#'));// {}
console.log(execUrlParams('##'));//{'#':''}
console.log(execUrlParams('?q=3606&src=srp')); //{q: "3606", src: "srp"}
console.log(execUrlParams('test=a=b=c&&==&a='));//{test: "a=b=c", "": "=", a: ""}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/605318.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL架构简介

MySQL是系统架构中最常见的中间件&#xff0c;主要由Server层&#xff08;连接器Connectors、连接池Connection Pool、查询缓存query cache、分析器Parser、优化器Optimizer、执行器、binlog&#xff09;以及存储引擎层组成。 MySQL架构简介 连接器 与客户端建立连接、认证身…

0803平面及其方程-向量代数与空间解析几何

文章目录 1 曲面方程与空间曲线方程的概念1.1 曲面方程1.2 空间曲线的方程 2 平面的点法式方程3 平面的一般方程4 两平面的夹角4.1 两平面夹角的定义4.2 夹角的余弦公式4.3 点到平面的距离 结语 1 曲面方程与空间曲线方程的概念 1.1 曲面方程 如果曲面与三元方程 ​ F ( x …

安捷伦MSOX4104A示波器/Agilent MSO-X4104A

安捷伦MSOX4104A示波器/Agilent MSO-X4104A 简介&#xff1a; 1GHz带宽 4个模拟通道 集成逻辑计时分析仪 配有业界*大的 12.1 英寸电容触摸屏 产品特点&#xff1a; 五合一的仪器 示波器 逻辑分析仪&#xff08;可选&#xff09; 串行协议分析仪&#xff08;USB2.0、ARIN…

柔性车间作业调度

1柔性车间作业调度 n n n个工件 { J 1 , J 2 , ⋯ , J n } \{J_1,J_2,\cdots,J_n\} {J1​,J2​,⋯,Jn​}要在 m m m台机器 { M 1 , M 2 , ⋯ , M m } \{M_1,M_2,\cdots,M_m\} {M1​,M2​,⋯,Mm​}上加工。每个工件包含一道或多道工序&#xff0c;工序顺序是预先确定的&#xf…

【Java|多线程与高并发】Thread 常见的方法总结

文章目录 1. 前言2. 方法getId()3. 方法getName()4. 方法getState()5. 方法getPriority(int newPriority)6. 方法isDaemon()和setDaemon()7. 方法isAlive()8. 方法isInterrupted()9. 方法currentThread()10. 方法sleep()11. 方法join()12. 总结 1. 前言 本文主要介绍Thread类常…

第11章_数据库的设计规范

第11章_数据库的设计规范 1. 为什么需要数据库设计 我们在设计数据表的时候&#xff0c;要考虑很多问题。比如: 用户都需要什么数据?需要在数据表中保存哪些数据?如何保证数据表中数据的正确性&#xff0c;当插入、删除、更新的时候该进行怎样的约束检查?。如何降低数据表…

javascript基础十八:说说你对JavaScript中事件循环的理解​

一、是什么 JavaScript 在设计之初便是单线程&#xff0c;即指程序运行时&#xff0c;只有一个线程存在&#xff0c;同一时间只能做一件事 为什么要这么设计&#xff0c;跟JavaScript的应用场景有关 JavaScript 初期作为一门浏览器脚本语言&#xff0c;通常用于操作 DOM &#…

【C++】C++11新特性的讲解

新特性讲解第一篇~ 文章目录 前言一、较为重要的新特性 1.统一的初始化列表2.decltype关键字3.右值引用移动语义总结 前言 C11 简介 &#xff1a; 在 2003 年 C 标准委员会曾经提交了一份技术勘误表 ( 简称 TC1) &#xff0c;使得 C03 这个名字已经取代了 C98 称为 C11 之前的…

【游戏编程扯淡精粹】工作第三年总结

工作第三年总结 文章目录 工作第三年总结#1 做了什么自研路线Lua 脚本系统ToolX #2 职业发展如何做事技术中台化内卷的职业市场个人成长 #3 心态建设Owner vs 打工人 今年仍然是个人成长视角更多一些&#xff0c;额外新学到的重点是&#xff0c;借助团队力量 先介绍两个词&…

通过自由度比较迭代次数

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点&#xff0c;AB训练集各由5张二值化的图片组成&#xff0c;让A中有7个1&#xff0c;B中全是0&#xff0c;让A的5行1的数量为1&#xff0c;1&#xff0c;1&#xff0c;2&#xff0c;2&#xff1b;让A的3列1的数量…

chatgpt赋能python:Python列表从后往前删除的方法及注意事项

Python列表从后往前删除的方法及注意事项 Python是一种功能强大而易于使用的编程语言。在Python中&#xff0c;列表是重要的数据类型之一&#xff0c;它可以存储任意类型的数据&#xff0c;例如整数、字符串、浮点数和对象等&#xff0c;而且列表数据可以动态添加或删除。在编…

numpy模块

目录 ❤ numpy简介 ❤ 为什么用numpy ❤ 创建numpy数组 ❤ numpy数组的常用属性 ❤ 获取numpy数组的行列数 ❤ 切割numpy数组 ❤ numpy数组元素替换 ❤ numpy数组的合并 ❤ 通过函数创建numpy数组 array arange linspace/logspace zeros/ones/eye/empty …

多功能电子听诊器(CMS-VESD)产品使用说明

Copyright reserved 子曰&#xff1a;桃李不言&#xff0c;下自成蹊。 Copyright reserved Ⅰ . 产品描述 : C M S − V E S D Ⅰ. 产品描述:^{CMS-VESD} Ⅰ.产品描述:CMS−VESD Ⅰ . 1 主要特点 : 如有疑问可留言沟通交流 Ⅰ.1 主要特点:^{如有疑问可留言沟通交流} Ⅰ.1主要特…

[python bezier贝塞尔曲线] 数值解法、德卡斯特里奥解法解法以及bezier库的使用demo

修改自这个老哥的&#xff0c;非常的nice,此处仅作为学习记录。 matplotlib3.7.0 可行 Note: 数值解法是真的快 先上图 import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import numpy as np import math import timeclass Bezier:def __init__(se…

使用HTML5开发Kinect体感游戏

一、简介 我们要做的是怎样一款游戏&#xff1f; 在前不久成都TGC2016展会上&#xff0c;我们开发了一款《火影忍者手游》的体感游戏&#xff0c;主要模拟手游章节《九尾袭来 》&#xff0c;用户化身四代&#xff0c;与九尾进行对决&#xff0c;吸引了大量玩家参与。 表面上看…

Makerbase SimpleFOC ESP32 例程5 双电机闭环位置测试

Makerbase SimpleFOC ESP32 例程5 双电机闭环位置测试 第一部分 硬件介绍 1.1 硬件清单 序号品名数量1ESP32 FOC V1.0 主板12YT2804电机2312V电源适配器14USB 线156pin杜邦线2 注意&#xff1a;YT2804是改装的云台无刷电机,带有AS5600编码器&#xff0c;可实现360连续运转。…

香蕉派(Banana Pi) BPi-P2 Zero开源硬件物联网开发板评测

我们从制造商处收到的样品 BPi-P2 Zero 和 BPi-P2 Maker SBC 用于本次审查的体验非常好。这些都是基于多年H3/H2 SoC使用经验的高质量硬件实现。 优点 优良的价格和适用性稳定且经过验证的架构低散热供电电源WiFi / 蓝牙 kod 零模型完美平衡的 Maker 模型 Banana Pi BPi-P2 的…

设备树与pinctrl

设备树与pinctrl 原理&#xff1a;芯片内部有个内存控制器访问芯片的各个控制器单元&#xff08;如IIC、USB等&#xff09;&#xff0c; 阅读手册设置其相应功能即可。 设备树 是一种描述硬件的数据结构,由专门文件格式与语法结构。 pinctrl Pinctrl&#xff1a;Pin Contr…

vue-router(element侧导栏,子组件内容切换,不传参)使用的详细步骤

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

如何申请免费ChatGPT 2500刀初创金

近日OpenAI 推出了OpenAI for Startups项目&#xff0c;那么什么是Startups项目呢&#xff1a; 它是由全球知名的人工智能研究公司 OpenAI 推出的一个开放式的创业计划&#xff0c;旨在为初创公司提供一种新的激励机制和技术推广方式。 也就是说我们可以用自己账号申请&#x…