前端开发必备:掌握正则表达式,轻松应对复杂的表单验证

前言

在前端开发中,经常需要处理 URL 地址、校验手机号合法性、提取域名等。正则表达式是一种常用的工具。通过使用正则表达式,我们可以对用户输入进行有效的验证,确保数据的合法性和完整性。本文将介绍一些常见的正则表达式,帮助你在开发中处理匹配的关键信息。


一、正则表达式的常用用法

1.1 模式匹配(match 方法)

在这个示例中,我们使用 match 方法来执行模式匹配操作。用户在文本输入框中输入的文本将与正则表达式 /abc/ 进行匹配,匹配结果将显示在页面上。

<template>
  <div>
    <input type="text" v-model="inputText" placeholder="输入文本">
    <button @click="matchPattern">匹配</button>
    <p>匹配结果: {{ matchResult }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      inputText: "",
      matchResult: "",
    };
  },
  methods: {
    matchPattern() {
      const pattern = /abc/; // 匹配包含子字符串 "abc" 的任何字符串
      this.matchResult = this.inputText.match(pattern);
    },
  },
};
</script>

实现效果

在这里插入图片描述


1.2 替换操作(replace 方法)

在这个示例中,我们使用 replace 方法来执行替换操作。用户在文本输入框中输入的文本中的匹配项将被替换为指定的字符串。在示例中,我们将正则表达式 /abc/ 匹配到的文本替换为 xyz

<template>
  <div>
    <input type="text" v-model="inputText" placeholder="输入文本">
    <button @click="replacePattern">替换</button>
    <p>替换结果: {{ replaceResult }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      inputText: "",
      replaceResult: "",
    };
  },
  methods: {
    replacePattern() {
      const pattern = /abc/; // 替换包含子字符串 "abc" 的任何字符串
      this.replaceResult = this.inputText.replace(pattern, "xyz");
    },
  },
};
</script>

实现效果

在这里插入图片描述


1.3 分割和分组(split 方法)

在这个示例中,我们使用 split 方法来执行分割操作。用户在文本输入框中输入的文本将根据正则表达式 /\s+/ 进行分割,分割结果将以列表形式显示在页面上。

<template>
  <div>
    <input type="text" v-model="inputText" placeholder="输入文本">
    <button @click="splitText">分割</button>
    <ul>
      <li v-for="item in splitResult" :key="item">{{ item }}</li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      inputText: "",
      splitResult: [],
    };
  },
  methods: {
    splitText() {
      const pattern = /\s+/; // 匹配一个或多个连续的空白字符
      this.splitResult = this.inputText.split(pattern);
    },
  },
};
</script>

实现效果

在这里插入图片描述


1.4 验证输入(test 方法)

在这个示例中,我们使用 test 方法来执行验证操作。用户在文本输入框中输入的文本将与正则表达式 /^\d{4}$/ 进行匹配,如果匹配成功,则输入被视为有效,否则被视为无效。

<template>
  <div>
    <input type="text" v-model="inputText" placeholder="输入文本">
    <button @click="validateInput">验证</button>
    <p v-if="isValid">输入有效</p>
    <p v-else>输入无效</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      inputText: "",
      isValid: false,
    };
  },
  methods: {
    validateInput() {
      const pattern = /^\d{4}$/; // 确保一个字符串由四个数字字符组成,且没有其他额外的字符。例如,可以匹配 "1234" 或 "5278",但不匹配 "12" 或 "12345"。
      this.isValid = pattern.test(this.inputText);
    },
  },
};
</script>

实现效果

在这里插入图片描述


1.5 数据搜索(search 方法)

在这个示例中,我们使用 search() 方法来搜索输入文本中是否包含指定的正则表达式模式。如果找到匹配,则将匹配的字符串添加到 matches 数组中;否则,将其设置为空数组。请注意,search() 方法返回匹配的字符串的起始位置,而不是匹配的字符串本身。因此,我们需要使用 slice() 方法来获取匹配的字符串。

<template>
  <div>
    <input type="text" v-model="inputText">
    <button @click="searchUsingRegex">搜索</button>
    <div v-if="matches.length > 0">
      <p>匹配到的单词:</p>
      <ul>
        <li v-for="match in matches" :key="match">{{ match }}</li>
      </ul>
    </div>
    <div v-else>
      <p>没有匹配到单词。</p>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      inputText: "",
      matches: [],
    };
  },
  methods: {
    searchUsingRegex() {
      const regex = /^p\w+/; // 匹配以字母 "p" 开头,后面跟着一个或多个字母、数字或下划线的字符串
      const match = this.inputText.search(regex);
      if (match !== -1) {
        this.matches = [this.inputText.slice(match)];
      } else {
        this.matches = [];
      }
    },
  },
};
</script>

实现效果

在这里插入图片描述


1.6 数据提取(exec 方法)

在这个示例中,我们使用正则表达式 /\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}\\b/g 来匹配邮箱地址。然后,我们使用 exec() 方法来提取输入文本中的所有匹配项。

<template>
  <div>
    <input type="text" v-model="inputText">
    <button @click="extractEmails">提取邮箱</button>
    <div v-if="emails.length > 0">
      <p>提取到的邮箱地址:</p>
      <ul>
        <li v-for="email in emails" :key="email">{{ email }}</li>
      </ul>
    </div>
    <div v-else>
      <p>没有找到邮箱地址。</p>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      inputText: "",
      emails: [],
    };
  },
  methods: {
    extractEmails() {
      const regex = /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/g; // 匹配合法的邮箱地址
      let match;
      this.emails = [];
      while ((match = regex.exec(this.inputText)) !== null) {
        this.emails.push(match[0]);
      }
    },
  },
};
</script>

实现效果

在这里插入图片描述


二、常用正则表达式修饰符和表达模式

2.1 修饰符可以在全局搜索中不区分大小写

修饰符解释
i执行对大小写不敏感的匹配。
g执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)
m执行多行匹配。

2.2 方括号用于查找某个范围内的字符

表达式解释
[abc]查找方括号之间的任何字符。
[0-9]查找任何从 0 至 9 的数字。
(xy)

2.3 元字符是拥有特殊含义的字符

元字符解释
\d查找数字。
\s查找空白字符。
\b匹配单词边界。
\uxxxx查找以十六进制数 xxxx 规定的 Unicode 字符。
\B匹配非单词边界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。
\D匹配一个非数字字符。等价于 [^0-9]。
\n匹配一个换行符。等价于 \x0a 和 \cJ。
\r匹配一个回车符。等价于 \x0d 和 \cM。
\S匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\w匹配字母、数字、下划线。等价于’[A-Za-z0-9_]'。
\W匹配非字母、数字、下划线。等价于 ‘[^A-Za-z0-9_]’。
\f匹配一个换页符。等价于 \x0c 和 \cL。

2.4 量词

量词解释
n+匹配任何包含至少一个 n 的字符串。
n*匹配任何包含零个或多个 n 的字符串。
n?匹配任何包含零个或一个 n 的字符串。
{n,m}匹配前面的模式至少 n 次且不超过 m 次。
{n,}匹配前面的模式至少 n 次。
{n}匹配前面的模式恰好 n 次。

三、常见的正则表达式

3.1 校验数字的表达式

数字:

^[0-9]*$

n 位的数字:

^\d{n}$

至少 n 位的数字:

^\d{n,}$

m-n 位的数字:

^\d{m,n}$

零和非零开头的数字:

^(0|[1-9][0-9]*)$

非零开头的最多带两位小数的数字:

^([1-9][0-9]*)+(\.[0-9]{1,2})?$

1-2 位小数的正数或负数:

^(\-)?\d+(\.\d{1,2})$

正数、负数、和小数:

^(\-|\+)?\d+(\.\d+)?$

有两位小数的正实数:

^[0-9]+(\.[0-9]{2})?$

1~3 位小数的正实数:

^[0-9]+(\.[0-9]{1,3})?$

非零的正整数:

^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$

非零的负整数:

^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$

非负整数:

^\d+$ 或 ^[1-9]\d*|0$

非正整数:

^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$

非负浮点数:

^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$

非正浮点数:

^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$

正浮点数:

^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$

负浮点数:

^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$

浮点数:

^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

3.2 校验字符的表达式

汉字:

^[\u4e00-\u9fa5]{0,}$

英文和数字:

^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$

长度为 3-20 的所有字符:

^.{3,20}$

26 个英文字母组成的字符串:

^[A-Za-z]+$

26 个大写英文字母组成的字符串:

^[A-Z]+$

26 个小写英文字母组成的字符串:

^[a-z]+$

由数字和 26 个英文字母组成的字符串:

^[A-Za-z0-9]+$

由数字、26 个英文字母或者下划线组成的字符串:

^\w+$ 或 ^\w{3,20}$

中文、英文、数字包括下划线:

^[\u4E00-\u9FA5A-Za-z0-9_]+$

中文、英文、数字但不包括下划线等符号:

^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$

可以输入含有 ^%&',;=?$\" 等特殊字符:

[^%&',;=?$\x22]+

禁止输入含有 ~ 的字符:

[^~]+

3.3 特殊需求表达式

邮箱地址:

^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

域名:

[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?

网址:

[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$

手机号码:

^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$

电话号码(“XXX-XXXXXXX”、“XXXX-XXXXXXXX”、“XXX-XXXXXXX”、“XXX-XXXXXXXX”、"XXXXXXX"和"XXXXXXXX):

^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$

国内电话号码(0511-4405222、021-87888822):

\d{3}-\d{8}|\d{4}-\d{7}

电话号码正则表达式(支持手机号码,3-4 位区号,7-8 位直播号码,1-4 位分机号):

((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)

身份证号(15 位、18位数字),最后一位是校验位,可能为数字或字符 X

(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)

帐号是否合法(字母开头,允许 5-16 字节,允许字母数字下划线):

^[a-zA-Z][a-zA-Z0-9_]{4,15}$

密码(以字母开头,长度在 6~18 之间,只能包含字母、数字和下划线):

^[a-zA-Z]\w{5,17}$

强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在 8-10 之间):

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,10}$

强密码(必须包含大小写字母和数字的组合,可以使用特殊字符,长度在 8-10 之间):

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$

日期格式(YYYY-MM-DD):

^\d{4}-\d{1,2}-\d{1,2}

一年的 12 个月( 01~091~12):

^(0?[1-9]|1[0-2])$

一个月的 31 天( 01~091~31):

^((0?[1-9])|((1|2)[0-9])|30|31)$

xml 文件:

^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$

中文字符的正则表达式:

[\u4e00-\u9fa5]

双字节字符:

[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))

空白行的正则表达式:

\n\s*\r (可以用来删除空白行)

HTML 标记的正则表达式:

<(\S*?)[^>]*>.*?|<.*? /> ( 首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)

腾讯 QQ 号:

[1-9][0-9]{4,} (腾讯QQ号从10000开始)

中国邮政编码:

[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)

IPv4 地址:

((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Meproc:简单高效的跨平台进程/任务管理工具

最近使用 Melang 语言写了一个 supervisor 相似服务Meproc来管理进程。 Meproc 有如下特性&#xff1a; 使用 HTTP API 管理控制 Meproc 来管理进程跨平台&#xff0c;支持 UNIX/Linux 、Mac 、Windows 等平台支持 cron 类定时调度任务支持简单的任务间依赖关系支持原生的协…

如何打赢稳定性之战?

文章目录 前言为什么总会出现问题呢&#xff1f;如何证明你的稳定性做的有效果&#xff1f;既是持久战&#xff0c;也是防御战1. 提前建筑好防御工事2. 以攻为守3. 找外部支援和配合 前言 随着23年年末期间&#xff0c;各大厂争先恐后的出现的各种线上故障&#xff0c;一时间“…

highlight.js 实现搜索关键词高亮效果 ,显示匹配数量及切换显示功能

先看效果&#xff1a; 更新&#xff1a;增加切换显示 折腾了老半天&#xff0c;记录一下 注意事项都写注释了 代码&#xff1a; <template><div class"absolute-lt wh-full overflow-hidden p-10"><div style"width: 200px"><el-…

学网络必懂的华为CSS堆叠技术

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; 厦门微思网络​​​​​​https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom Linux\RHCE\RHCE 9.0\RHCA\ Oracle OC…

【Python数据分析系列】实现txt文件与列表(list)相互读写转换(源码+案例)

这是Python数据分析系列原创文章&#xff0c;我的第199篇原创文章。 一、问题 平时在做数据分析或者程序开发的时候&#xff0c;需要将中间的一些结果或最后的处理结果保存下来&#xff0c;比如保存为txt格式的文本文件&#xff0c;这就涉及列表与txt之间的一种读取和写入操作…

【LV13 DAY16 轮询与中断】

轮询实现按键实验 #include "exynos_4412.h"int main() {//GPX1_1设置为输入模式//GPX1.CONGPX1.CON & (~ (0XF<<4));while(1){if(!(GPX1.DAT&(1<<1))){printf("key pressed\n");while(!(GPX1.DAT&(1<<1)));}else{}}return…

1127: 矩阵乘积

题目描述 计算两个矩阵A和B的乘积。 输入 第一行三个正整数m、p和n&#xff0c;0<m,n,p<10&#xff0c;表示矩阵A是m行p列&#xff0c;矩阵B是p行n列&#xff1b; 接下来的m行是矩阵A的内容&#xff0c;每行p个整数&#xff0c;用空格隔开&#xff1b; 最后的p行是矩…

【期末不挂科-单片机考前速过系列P11】(第十一章:15题速过串行口的工作原理和应用)经典例题盘点(带图解析)

前言 大家好吖&#xff0c;欢迎来到 YY 滴单片机速过系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过单片机的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏…

【模型评估 02】ROC曲线

二值分类器&#xff08;Binary Classifier&#xff09;是机器学习领域中最常见也是应用最广泛的分类器。评价二值分类器的指标很多&#xff0c;比如precision、recall、F1 score、P-R曲线等。相比而言&#xff0c;ROC曲线有很多优点&#xff0c;经常作为评估而知分类器最重要的…

增强FAQ搜索引擎:发挥Elasticsearch中KNN的威力

英文原文地址&#xff1a;https://medium.com/nerd-for-tech/enhancing-faq-search-engines-harnessing-the-power-of-knn-in-elasticsearch-76076f670580 增强FAQ搜索引擎&#xff1a;发挥Elasticsearch中KNN的威力 2023 年 10 月 21 日 在一个快速准确的信息检索至关重要的…

Servlet JSP-实现简单的登录功能

本篇文章讲解如何使用Servlet-JSP-实现简单的登录功能。我们在进行Servlet和JSP实现简单登录功能的过程中&#xff0c;首先通过Eclipse创建了一个Maven项目&#xff0c;这为我们的Web应用提供了良好的项目管理和依赖管理。接下来&#xff0c;我们解决了新建项目时可能出现的报错…

CDN内容分发网络

1、CDN的含义 1.1 什么是CDN&#xff1f; CDN是内容分发网络&#xff08;Content Delivery Network&#xff09;的缩写。它是一种通过将内容部署到全球各地的服务器节点&#xff0c;使用户能够快速访问和下载内容的网络架构。 简单来说&#xff0c;CDN通过将内容分发到离用户更…

鸿蒙应用开发学习:改进小鱼动画实现按键一直按下时控制小鱼移动和限制小鱼移出屏幕

一、前言 近期我在学习鸿蒙应用开发&#xff0c;跟着B站UP主黑马程序员的视频教程做了一个小鱼动画应用&#xff0c;UP主提供的小鱼动画源代码仅仅实现了移动组件的功能&#xff0c;还存在一些问题&#xff0c;如默认进入页面是竖屏而页面适合横屏显示&#xff1b;真机测试发现…

【纯CSS特效源码】(二)精美的立体字

1.漂浮感立体 关键处&#xff1a; text-shadow:2px -2px white, -6px 6px gray;给字体添加了两层shadow&#xff0c;右上角白色提亮&#xff0c;左下角灰色阴影。 参数解释&#xff1a;例子中2px -2px white&#xff0c;代表右上角白色 第一个参数2px&#xff1a;正数表示从左…

C++ 完成Client分页显示log

分页显示t_log 1、获取用户的输入 1.1、写一个Input成员函数&#xff0c;处理输入进来的语句 std::string XClient::Input() {//清空缓冲//cin.ignore(4096, \n);string input "";for (;;){char a getchar();if (a < 0 || a \n || a \r)break;cout <<…

基于鸿蒙HarmonyOS 元服务开发一款公司运营应用(ArkTS API 9)

前言 最近基于Harmony OS最新版本开发了一个作品&#xff0c;本文来详细讲解一下&#xff0c;如何我是如何开发这个作品的。以及如何使用OpenHarmony&#xff0c;基于ArkTS&#xff0c;API 9来开发一个属于自己的元服务。 废话不多说&#xff0c;我的作品名称叫做Company Oper…

Spring Boot 中实现文件上传、下载、删除功能

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

【RPC】序列化:对象怎么在网络中传输?

今天来聊下RPC框架中的序列化。在不同的场景下合理地选择序列化方式&#xff0c;对提升RPC框架整体的稳定性和性能是至关重要的。 一、为什么需要序列化&#xff1f; 首先&#xff0c;我们得知道什么是序列化与反序列化。 网络传输的数据必须是二进制数据&#xff0c;但调用…

Jenkins-Maven Git

整合Maven 安装GIT #更新yum sudo yum update #安装git yum install git 安装Maven插件,在插件管理中心&#xff1a; 配置仓库 配置密码认证 我们可以在这个目录下看到Jenkins 帮我们拉取了代码 /env/liyong/data/docker/jenkins_mount/workspace/maven-job 配置maven打包…

江科大STM32 下

目录 ADC数模转换器DMA直接存储器存取USART串口9-2 串口发送接受9-3 串口收发HEX数据包 I2CSPI协议10.1 SPI简介W25Q64简介10.3 SPI软件读写W25Q6410.4 SPI硬件读写W25Q64 BKP、RTC11.0 Unix时间戳11.1 读写备份寄存器BKP11.2 RTC实时时钟 十二、PWR12.1 PWR简介12.2 修改主频1…