JavaScript正则表达式

server/2025/2/1 15:36:48/

为了方便前端做一些输入验证,我们需要掌握正则表达式

一、创建正则表达式

  1. 使用正则表达式字面量,由包含在斜杠之间的模式组成
    // 验证手机号
    var phoneNumber = /^1[3-9]\d{9}$/;
    
  2. 调用RegExp对象的构造函数
    // 校验是够包含abc
    var re = new RegExp("abc");
    console.log(re); // /abc/
    

二、使用正则表达式

2.1、reg.test(字符串) 测试字符串是否匹配

一个在字符串中测试是否匹配的 RegExp 方法,它返回 true 或 false。包含即可

var reg = /\d/;
console.log(res.test("abc")); //测试abc是否包含数字,false

2.2、exec()

在字符串中查找匹配的内容,返回一个数组(包含匹配结果和分组信息),如果没有匹配则返回 null。
注意:exec默认只能返回首个匹配项,如果要找到所有的,就要设置全局修饰符g(下边有介绍),然后去循环exec,直到为null

// 加了()所以是数组
const regex = /(\d{2})-(\d{2})-(\d{4})/;
const result = regex.exec("Date: 05-10-2023");
console.log(result[0]); // "05-10-2023"(完整匹配)
console.log(result[1]); // "05"(第一个分组)
console.log(result[2]); // "10"(第二个分组)
console.log(result[3]); // "2023"(第三个分组)

2.3 match()

在字符串中查找匹配的内容,返回一个数组(包含匹配结果和分组信息),如果没有匹配则返回 null。

const regex = /(\d{2})-(\d{2})-(\d{4})/;
const result = "Date: 05-10-2023".match(regex);
console.log(result[0]); // "05-10-2023"(完整匹配)
console.log(result[1]); // "05"(第一个分组)
console.log(result[2]); // "10"(第二个分组)
console.log(result[3]); // "2023"(第三个分组)

2.3、search()

在字符串中查找匹配的内容,返回匹配的起始位置索引,如果没有匹配则返回 -1。

const regex = /world/;
console.log("hello world".search(regex)); // 6
console.log("hello there".search(regex)); // -1

2.5、 replace()

在字符串中查找匹配的内容,并用指定的字符串替换。
仍然是懒惰特性,如果要全部替换,记得加g

const regex = /world/;
const result = "hello world".replace(regex, "there");
console.log(result); // "hello there"
const regex = /(\d{2})-(\d{2})-(\d{4})/;
const result = "Date: 05-10-2023".replace(regex, (match, p1, p2, p3) => {return `${p3}/${p2}/${p1}`; // 2023/10/05
});
console.log(result); // "Date: 2023/10/05"

三、编写正则表达式

3.1、元字符

  • 匹配单个字符
元字符描述
.匹配除换行符(\n)以外的任意单个字符。
\d匹配单个任意数字字符(等价于 [0-9])。
\D匹配单个任意非数字字符(等价于 [^0-9])。
\w匹配单个任意字母、数字或下划线(等价于 [a-zA-Z0-9_])。
\W匹配单个任意非字母、数字或下划线的字符(等价于 [^a-zA-Z0-9_])。
\s匹配单个任意空白字符(包括空格、制表符、换行符等)。
\S匹配单个任意非空白字符。
[abc]匹配方括号内的任意单个字符(例如 a、b 或 c)。
[^abc]匹配不在方括号内的任意单个字符(例如非 a、b、c 的字符)。
\.\.对元字符.进行转义
  • 匹配多个字符
    限制前面的单个字符或者()整体
元字符描述
*匹配前面的字符 0 次或多次。
+匹配前面的字符 1 次或多次。
?匹配前面的字符 0 次或 1 次(表示可选)。
{n}匹配前面的字符恰好 n 次。
{n,}匹配前面的字符至少 n 次。
{n,m}匹配前面的字符至少 n 次,至多 m 次。
var reg = /\d+/;console.log(reg.test("abc")); // false
console.log(reg.test("1c")); //true
console.log(reg.test("a12c")); //truereg = /\d?/; //限定0~1个数字 reg = /\d{3}/; //恰好三个数字
console.log(reg.test("1234")); // true
console.log(reg.test("123")); // true
console.log(reg.test("a12"));  // false

3.2、边界符

元字符描述
^匹配字符串的开头。
$匹配字符串的结尾。
\b匹配单词边界(单词的开头或结尾)。
\B匹配非单词边界。
// 限制开头结束, 
// 测试是否包含这样一个字符串:开头是a, 中间是一位数字,结尾是c
var reg = /^a\dc$/;console.log(reg.test("abc")); //false
console.log(reg.test("a1c")); //true
console.log(reg.test("a12c")); //false

3.3、特殊

元字符描述
(abc)将 abc 作为一个分组捕获。
(?:abc)将 abc 作为一个非捕获分组(不捕获匹配的内容)。
|逻辑或,匹配左边或右边的表达式。
\转义字符,用于匹配元字符本身(例如 . 匹配 .)。
var reg = /a|b/; //匹配a或b
var reg = /(abc|def)/; // 匹配abc或者def

3.4、 修饰符

修饰符描述
i忽略大小写匹配。
g全局匹配(匹配所有符合条件的结果,而不是仅匹配第一个)。
m多行模式,使 ^ 和 $ 匹配每行的开头和结尾。
s单行模式,使 . 匹配包括换行符在内的所有字符。
u启用 Unicode 匹配(ES6+)。
y粘性匹配,从 lastIndex 开始匹配(ES6+)。
放在//的后边
var reg = /\d{1,3}/g;

四、两大特性

懒惰:多次调用exec总是匹配第一个,通过g去解决
贪婪:尽可能多的去匹配。通过加一个问号/\d{1,4}?/,表示总是匹配最短的

五、常见示例

https://www.regexp.cn/Regex/CommonRegex

https://fehelper.com/fehelper/regexp/index.html


http://www.ppmy.cn/server/164098.html

相关文章

开源先锋DeepSeek-V3 LLM 大语言模型本地调用,打造自己专属 AI 助手

DeepSeek-V3是一个强大的混合专家 (MoE) 语言模型,总共有 671B 个参数。为了实现高效的推理和经济高效的训练,DeepSeek-V3 采用了多头潜在注意力机制 (MLA) 和 DeepSeekMoE 架构,这些架构在 DeepSeek-V2 中得到了彻底的验证。此外&#xff0c…

汇编语法及相关指令

1.汇编指令的基本格式&#xff1a; <opcode>{<cond>}{s} <Rd>, <Rn>, <shifter_operand> opcode&#xff1a;指令的功能码&#xff0c;用来表示当前指令的作用 cond&#xff1a;条件码&#xff0c;需要在指令执行之前先判断条件受否满足&…

Qt调用FFmpeg库实时播放UDP组播视频流

基于以下参考链接&#xff0c;通过改进实现实时播放UDP组播视频流 https://blog.csdn.net/u012532263/article/details/102736700 源码在windows&#xff08;qt-opensource-windows-x86-5.12.9.exe&#xff09;、ubuntu20.04.6(x64)(qt-opensource-linux-x64-5.12.12.run)、以…

代发考试战报:1月22号 1月23号 CCDE考试通过

还有几个人考的也考过了&#xff0c;但是只有俩位考生提供了成绩单截图&#xff0c;有的考生反馈遇到6-7个新题&#xff0c;有的考生反馈遇到将近20个新题&#xff0c;差距比较大&#xff0c;最终结果都一样&#xff0c;都是通过了 #华为#HCIP#题库#考试#思科#CCNP#CCNA#HCIA#通…

【JavaEE进阶】应用分层

目录 &#x1f38b;序言 &#x1f343;什么是应用分层 &#x1f38d;为什么需要应用分层 &#x1f340;如何分层(三层架构) &#x1f384;MVC和三层架构的区别和联系 &#x1f333;什么是高内聚低耦合 &#x1f38b;序言 通过上⾯的练习,我们学习了SpringMVC简单功能的开…

基于物联网设计的疫苗冷链物流监测系统

一、前言 1.1 项目开发背景 随着全球经济的发展和物流行业的不断创新&#xff0c;疫苗和生物制品的运输要求变得越来越高。尤其是疫苗的冷链物流&#xff0c;温度、湿度等环境因素的控制直接关系到疫苗的质量和效力&#xff0c;因此高效、可靠的冷链监控系统显得尤为重要。冷…

基于Django的Boss直聘IT岗位可视化分析系统的设计与实现

【Django】基于Django的Boss直聘IT岗位可视化分析系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统采用Python作为主要开发语言&#xff0c;利用Django这一高效、安全的W…

【人工智能】基于Python的机器翻译系统,从RNN到Transformer的演进与实现

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 机器翻译(Machine Translation, MT)作为自然语言处理领域的重要应用之一,近年来受到了广泛的关注。在本篇文章中,我们将详细探讨如何使…