不允许输入特殊字符的正则表达式_JavaScript正则表达式常用技巧

1f8b8e3bc16fa48125df1bd91d7cccf4.png

正则表达式是用于匹配字符串中字符组合的模式。在 JavaScript 中,正则表达式也是对象。这些模式被用于 RegExp 的 exectest 方法, 以及 String 的 matchmatchAllreplacesearchsplit 方法。正则表达式的掌握程度能粗略地看出程序员的技术底子,所以技术面试、编程竞赛等 都特别喜欢考察正则表达式。本篇就带你一起夯实一下 JavaScript 正则表达式的一些使用技巧:

创建正则表达式

在 JavaScript 的世界,创建正则表达式有2个方法: (1)使用一个正则表达式字面量,其由包含在斜杠之间的模式组成。比如 :

const reg = /ab+c/

(2)调用RegExp对象的构造函数。比如:

const reg = new RegExp("ab+c")

注意:以上2个方法虽然都能创建正则表达式,但是还是有区别的: (1)使用第一个方法,在脚本加载后正则表达式字面量就会被编译。当正则表达式保持不变时,使用此方法可获得更好的性能。 (2)使用第二个方法,在脚本运行过程中用构造函数创建的正则表达式会被编译。如果正则表达式将会改变,或者它将会从用户输入等来源中动态地产生,就需要使用构造函数来创建正则表达式。

当然,这样表述可能不太深刻,下面找一道面试题带你实践一下。

经典面试题 "Word Finder"

题目要求:
使用一个方法来扩展字典,该方法返回与模式匹配的单词列表。这个模式可以包含字母(小写)和占位符("?")。占位符只代表一个任意的字母,比如: const fruits = new Dictionary(['banana', 'apple', 'papaya', 'cherry']);
fruits.getMatchingWords('lemon');     // must return []
fruits.getMatchingWords('cherr??');   // must return []
fruits.getMatchingWords('?a?a?a');    // must return ['banana', 'papaya']
fruits.getMatchingWords('??????');    // must return ['banana', 'papaya', 'cherry']补充说明:
(1)单词和模式都是小写
(2)返回单词的顺序无关紧要

上面这道题目是典型的 正则表达式应用题,考察的知识点是2个: (1)使用 RegExp 对象 动态创建正则表达式 (2)使用 /./ 匹配一个任意字符

因此不难有如下解决方案(ps:这个是我的解决方案,虽然解法比较low,但是逻辑应该还算清晰,容易理解)

// 字典构造器
function Dictionary(words) {this.words = words;
}// 原型里拓展解法
Dictionary.prototype.getMatchingWords = function(pattern) {let res = []const reg = new RegExp("^" + pattern.replace(/?/g, '.') + "$")  // 创建正则表达式for (let x of this.words) {if (reg.test(x)) res.push(x) }return res
}

如果你有更好的解法,欢迎评论留言哈 ^_^

正则表达式模式

一个正则表达式模式是由简单的字符所构成的,比如 /abc/;或者是简单和特殊字符的组合,比如 /ab*c//Chapter (d+).d*/

简单模式

简单模式是由想要匹配的具体字符组成,且严格匹配字符顺序。比如,/abc/ 这个模式就能且仅能匹配 "abc" 字符按照顺序同时出现的情况,而 "bac" 或 "cab" 等就无法匹配。

特殊字符

当需要匹配一个不确定的字符串时,比如寻找一个或多个 "b",或者寻找空格,可以在模式中使用特殊字符。特殊字符还包括如下:

  • 断言:表示一个匹配在某些条件下发生。断言包括先行断言、后行断言和条件表达式
  • 字符类:区分不同类型的字符,例如区分字母和数字
  • 组和范围:表示表达式字符的分组和范围
  • 量词:表示匹配的字符或条件表达式的数量
  • Unicode属性转义:基于 Unicode字符属性区分字符,例如大写和小写字母、数字符合和标点

Escaping

当需要使用任何特殊字符的字面值(例如,搜索字符 *),你必须通过在它前面放一个反斜杠来转义它。 例如,要搜索'a'后跟*后跟'b',你应该使用 /a*b/- 反斜杠“转义”字符 *,使其成为文字而非特殊符号。将用户输入转义为正则表达式中的一个字面字符串,可以通过简单的替换来实现:

function escapeRegExp(string) {return string.replace(/[.*+?^${}()|[]]/g, "$&");   //$&表示整个被匹配的字符串
}

使用正则表达式

前面讲到,正则表达式可以被用于 RegExp 的 exectest 方法以及 String 的 matchreplacesearchsplit 方法。这些方法在 JavaScript 手册 中有详细的解释,下面只简单罗列下各自功能,不做展开:

  • exec:在字符串中执行查找匹配的 RegExp 方法,它返回一个数组(未匹配到则返回 null
  • test:在字符串中测试是否匹配的 RegExp 方法,它返回 truefalse
  • match:在字符串中执行查找匹配的 String 方法,它返回一个数组,在未匹配到时会返回 null
  • matchAll:在字符串中执行查找所有匹配的 String 方法,它返回一个迭代器(iterator
  • search:在字符串中测试匹配的 String 方法,它返回匹配到的位置索引,或者在失败时返回 -1
  • replace:在字符串中执行查找匹配的 String 方法,并且使用替换字符串替换掉匹配到的子字符串
  • split:使用正则表达式或者一个固定字符串分隔一个字符串的String方法,并将分隔后的子字符串存储到数组中

一个简单的快速记忆方法: (1)想要知道在一个字符串中的一个匹配是否被找到,使用 testsearch 方法 (2)想得到更多的信息(但是比较慢)则可以使用 execmatch 方法

举个栗子,使用exec方法在一个字符串中查找一个匹配:

const myRe = /d(b+)d/g;
const myArray = myRe.exec("cdbbdbsbz");

如果不需要访问正则表达式的属性,这个脚本通过另一个方法来创建myArray:

const myArray = /d(b+)d/g.exec("cdbbdbsbz");
// 和 "cdbbdbsbz".match(/d(b+)d/g); 相似。
// 但是 "cdbbdbsbz".match(/d(b+)d/g) 输出数组 [ "dbbd" ],
// 而 /d(b+)d/g.exec('cdbbdbsbz') 输出数组 [ "dbbd", "bb", index: 1, input: "cdbbdbsbz" ].

如果想通过一个字符串构建正则表达式,那么这个脚本还有另一种方法:

const myRe = new RegExp("d(b+)d", "g");
const myArray = myRe.exec("cdbbdbsbz");

使用括号的子字符串匹配

一个正则表达式模式使用括号,将导致相应的子匹配被记住。例如,/a(b)c / 可以匹配字符串“abc”,并且记得“b”。回调这些括号中匹配的子串,使用数组元素[1],……[n]。

使用括号匹配的子字符串的数量是无限的。返回的数组中保存所有被发现的子匹配。下面的例子说明了如何使用括号的子字符串匹配。

下面的脚本使用 replace() 方法来转换字符串中的单词。在匹配到的替换文本中,脚本使用替代的$1, $2 表示第一个和第二个括号的子字符串匹配:

const re = /(w+)s(w+)/;
const str = "John Smith";
const newstr = str.replace(re, "$2, $1");
console.log(newstr);   // 输出 "Smith, John"

通过标志进行高级搜索

正则表达式有六个可选参数 (flags) 允许全局和不分大小写搜索等。这些参数既可以单独使用也能以任意顺序一起使用, 并且被包含在正则表达式实例中:

  • g:全局搜索
  • i:不区分大小写搜索
  • m: 多行搜索
  • s:允许.匹配换行符
  • u:使用Unicode码的模式进行匹配
  • y:执行“粘性(sticky)”搜索, 匹配从目标字符串的当前位置开始

例如,re = /w+s/g 将创建一个查找一个或多个字符后有一个空格的正则表达式,或者组合起来像此要求的字符串:

const re = /w+s/g;
const str = "fee fi fo fum";
const myArray = str.match(re);
console.log(myArray);// ["fee ", "fi ", "fo "]

使用 .exec() 方法时,与 g 标志关联的行为是不同的。 (“class”和“argument”的作用相反:在.match()的情况下,字符串类(或数据类型)拥有该方法,而正则表达式只是一个参数,而在.exec()的情况下,它是拥有该方法的正则表达式,其中字符串是参数。对比str.match(re)re.exec(str) ), g标志与.exec()方法一起使用获得迭代进展:

const xArray; while(xArray = re.exec(str)) console.log(xArray);
// produces: 
// ["fee ", index: 0, input: "fee fi fo fum"]
// ["fi ", index: 4, input: "fee fi fo fum"]
// ["fo ", index: 7, input: "fee fi fo fum"]

除此之外,m标志用于指定多行输入字符串应该被视为多个行。如果使用m标志,^$匹配的开始或结束输入字符串中的每一行,而不是整个字符串的开始或结束。


@参考:正则表达式

本文由博客一文多发平台 OpenWrite 发布!

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

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

相关文章

latex 算法_GitHub项目awesome-latex-drawing新增内容(四):绘制贝叶斯网络

近期,我们整理和开源了一个基于LaTeX的科技绘图项目,并将其取名为awesome-latex-drawing(GitHub网址为:https://github.com/xinychen/awesome-latex-drawing),案例包括贝叶斯网络、图模型、矩阵/张量示意图…

mysql中的生日应该是什么类型_MySQL中的定点数类型

上一篇文章我们唠叨了浮点数,知道了浮点数存储小数是不精确的。本篇继续唠叨一下MySQL中的另一种存储小数的方式 —— 定点数。浮点数文章闪现:什么, 0.3 - 0.2 ≠ 0.1 ? 什么鬼定点数类型正因为用浮点数表示小数可能会有不精确的情况,在一些…

string转为char数组_StringBuilder的区别是什么?String是不可变?一点课堂(多岸学院)...

String和StringBuffer、StringBuilder的区别可变性简单的来说:String 类中使用 final 关键字字符数组保存字符串,private final char value[],所以 String 对象是不可变的。而StringBuilder 与 StringBuffer 都继承自 AbstractStringBuild…

mysql 升级 openssl_【1分钟教程】LNMP架构应用实战 Openssl升级操作

由于实际生产环境需求,需要将LNMP环境中的openssl版本升级至目前最新版本openssl-1.1.0c,这玩意升级还真的不是一般的麻烦,由于它与系统各种服务都有相关的联系,比如ssh服务等,因此,升级非常的繁琐,所以今天…

miui秒解bl锁_MIUI12解锁bl篇(原谅我的过失,接上篇文章)

求原谅真心求原谅由于我的疏忽,上期教程不完整,对大家造成不便在这里给大家真诚道歉!对不起!请收下我的膝盖!!!我的上个教程小米手机MIUI系统降级任意版本通用教程,MIUI12→MIUI9因为…

usbserialcontroller驱动安装不了_win10-有NVIDIA独显提示未安装控制面板的离线安装方式...

最近越来越多的用户反映NVIDIA显卡驱动设置不了啦,找不到NVIDIA显卡的控制面板。 也不知道NVIDIA在什么版本开始驱动安装包就不自带NVIDIA显卡控制面板了。 全新安装的显卡驱动就没有控制面板;或者Windows 10自带更新了显卡新版驱动后导致没有。 每次带N…

vue 点击li 中的img 怎么不冒泡_Vue全解

一.Vue实例内存图:1.把Vue的实例命名为vm,vm对象封装了对视图的所有操作包括数据读写、事件绑定、DOM更新2.vm的构造函数是Vue,按照ES6的说法vm所属的类是Vue3.options是new Vue的参数一般称为选项或构造选项1.options里面有什么英文文档搜op…

terminal services 找不到_电脑局域网中查看不到其他计算机或无法连接的解决办法...

在办公环境中,电脑经常需要打开网络,进行一些文件共享的操作,但是有时会出现很多无法共享的情况,之前有一篇文章讲过解决办法,今天再来将一下具体无法共享的错误提示和相对应的处理方法,主要有以下几种情况…

如何避免mysql回表查询_mysql如何避免回表查询

《迅猛定位低效SQL?》留了一个尾巴:select id,name where name‘shenjian‘select id,name,sexwhere name‘shenjian‘多查询了一个属性,为何检索过程完全不同?什么是回表查询?什么是索引覆盖?如何实现索引…

springmvc的工作原理_SpringMVC工作原理

1 简介SpringMVC框架是以请求为驱动,围绕Servlet设计,将请求发给控制器,然后通过模型对象,分派器来展示请求结果视图。其中核心类是DispatcherServlet,它是一个Servlet,顶层是实现的Servlet接口。2 运行原理…

跨站点请求伪造_十大常见web漏洞——跨站点请求伪造(CSRF)

CSRF介绍什么是CSRF呢?我们直接看例子。https://mp.toutiao.com/profile_v3/graphic/preview?dodelete&pgc_id6829574701128352260这个URL是头条删除pgc_id为6829574701128352260的一篇文章的连接,通过执行这个URL用户就可以删除这篇文章。首先攻击…

unique函数_C++核心准则C.35:基类的析构函数必须满足的条件

C.35: A base class destructor should be either public and virtual, or protected and nonvirtual基类的析构函数要么是公开的虚函数,要么是保护的非虚函数Reason(原因)To prevent undefined behavior. If the destructor is public, then calling code can atte…

java jta 例子_Java事务处理全解析(八)——分布式事务入门例子(Spring+JTA+Atomikos+Hibernate+JMS)...

在本系列先前的文章中,我们主要讲解了JDBC对本地事务的处理,本篇文章将讲到一个分布式事务的例子。请通过以下方式下载github源代码:本地事务和分布式事务的区别在于:本地事务只用于处理单一数据源事务(比如单个数据库)&#xff0…

垂直串联六关节机器人调试手册_工业机器人有哪些应用你知道吗?

目前,工业机器人大部分集中于传统的焊接、喷涂等领域,我国工业机器人的核心部件和整机市场仍被国外垄断,工业机器人要面向整个智能制造市场,还需要具备应对整个智能制造过程中大多数工艺的能力,而工业互联网则是实现智…

java 生成校验验证码_java生成验证码并进行验证

一实现思路使用BufferedImage用于在内存中存储生成的验证码图片使用Graphics来进行验证码图片的绘制,并将绘制在图片上的验证码存放到session中用于后续验证最后通过ImageIO将生成的图片进行输出通过页面提交的验证码和存放在session中的验证码对比来进行校验二、生…

yy自动语音接待机器人_智能语音机器人落地产品有哪些?

据相关研究报告表明,在众多人工智能落地产品或者应用场景中,智能语音机器人无论从产品的成熟度还是应用的广泛度来说,都是人工智能行业最热门和最有前景的产品。智能语音机器人并不只是一款产品,它是所有智能语音系列产品的统称&a…

java资源文件获取属性_Java读写资源文件类Properties

Java中读写资源文件最重要的类是Properties1) 资源文件要求如下:1、properties文件是一个文本文件2、properties文件的语法有两种,一种是注释,一种属性配置。注 释:前面加上#号属性配置:以“键值”的方式书写一个属性的配置信息…

java被放弃了_为什么学Java那么容易放弃?

学习Java确实很容易就放弃,但是也很容易就学好,因为大多数人都是抱着试一试的心态,然后当后面就坚持不下去但是回过头来想一想,打游戏上分容易吗,一样是磕磕碰碰的,有时候十几连跪都不会放弃你上分的心情。…

java编程50_java经典50编程题(1-10)

1.有一对兔子从出生后第三个月起,每个月都生一对小兔子,小兔子长到三个月后每个月又生一对兔子,假设兔子不死亡,问每个月兔子的总数为多少?分析过程图片发自简书App示例代码图片发自简书App运行结果图片发自简书App反思…

超大规模集成电路_纳米级超大规模集成电路芯片低功耗物理设计分析(二)

文 | 大顺简要介绍了功耗的组成,在此基础上从工艺、电路、门、系统四个层面探讨了纳米级超大规模集成电路的低功耗物理设计方法。关键词:纳米级;超大规模集成电路;电路芯片;电路设计02纳米级超大规模集成电路芯片低功耗…