千家信息网

怎么在javascript中使用正则表达式实现位置匹配

发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,这期内容当中小编将会给大家带来有关怎么在javascript中使用正则表达式实现位置匹配,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、前言正则表达式是匹配模式,
千家信息网最后更新 2025年01月23日怎么在javascript中使用正则表达式实现位置匹配

这期内容当中小编将会给大家带来有关怎么在javascript中使用正则表达式实现位置匹配,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

一、前言

正则表达式是匹配模式,要么是匹配字符,要么匹配位置。

二、什么是位置

位置:相邻字符之间的位置。

三、如何匹配位置

在ES5中,共有6个锚:^, $, \b, \B, (?=p), (?!p)

可视化形式:

RegExp:/^$\b\B(?=a)(?!b)/g

3.1 ^和$

^(脱字符)匹配开头,在多行匹配中匹配行开头。

$(美元符)匹配结尾,在多行匹配中匹配行结尾。

比如:我们把字符串的开头和结尾用#替换(位置可以替换成字符的):

var result = "hello".replace(/^|$/g, '#');console.log(result);// "#hello#"

多行匹配模式(有修饰符m)时,二者是行的概念,我们需要注意:

var result = "I\nlove\njavascript".replace(/^|$/gm, '#');console.log(result);// #I#// #love#// #javascript#

3.2 \b和\B

\b是单词边界,具体就是\w和\W之间的位置,也包括\w与^之间的位置,和\w和$之间的位置。

比如考察文件名"[JS] Lesson_01.mp4"中的\b,如下:

var result = "[JS] Lesson_01.mp4".replace(/\b/g, '#');console.log(result);// "[#JS#] #Lesson_01#.#mp4#"

首先,我们知道\w是字符组[0-9a-zA-Z]的简写,即使字母数字或者下划线中任何一个字符。而\W是字符组[^0-9a-zA-Z]的简写,即\W是\w以外的任何一个字符。

我们再来看#是怎么来的:

第 1 个,两边字符是 "[" 与 "J",是 \W 与 \w 之间的位置。

第 2 个,两边字符是 "S" 与 "]",也就是 \w 与 \W 之间的位置。

第 3 个,两边字符是空格与 "L",也就是 \W 与 \w 之间的位置。

第 4 个,两边字符是 "1" 与 ".",也就是 \w 与 \W 之间的位置。

第 5 个,两边字符是 "." 与 "m",也就是 \W 与 \w之间的位置。

第 6 个,位于结尾,前面的字符 "4" 是 \w,即 \w 与 $ 之间的位置。

知道了\b概念后,那\B就好理解了,\b是单词边界,\B是非单词边界

var result = "[JS] Lesson_01.mp4".replace(/\B/g, '#');console.log(result);// "#[J#S]# L#e#s#s#o#n#_#0#1.m#p#4"

3.3 (?=p) 和 (?!p)

(?=p)其中p是一个子模式,即 p前面的位置 (该位置后面的字符要匹配p)

比如:(?=e),表示的是e字符前面的位置;

var result = "hello".replace(/(?=l)/g, '#');console.log(result);// "he#l#lo"

而(?!p)就是(?=p)的反面意思

var result = "hello".replace(/(?!l)/g, '#');console.log(result);// "#h#ell#o#"

二者的学名分别是 positive lookahead 和 negative lookahead。

中文翻译分别是 正向先行断言负向先行断言

ES5 之后的版本,会支持 positive lookbehind 和 negative lookbehind。

具体是 (?<=p) 和 (?

四、位置特性

对于位置的理解,我们可以累计额成空字符""。

比如"hello"字符串等价于如下形式:

"hello" == "" + "h" + "" + "e" + "" + "l" + "" + "l" + "" + "o" + "";

也等价于

"hello" == "" + "" + "hello"

因此,把 /^hello$/ 写成 /^^hello$$$/,是没有任何问题的:

var result = /^^hello$$$/.test("hello");console.log(result);// true

也就是说,字符之间的位置,可以写成多个。

注:把 位置 理解 空字符 ,是对位置非常有效的理解方式

五、相关案例

5.1不匹配任何东西的正则

/.^/

正则要求 只有一个字符,但是该字符后面是开头 ,而这样的字符串是不存在的。

5.2数字的千分位分隔符表示法

比如吧12345678,变成12,345,678。

分析:那就是需要把相应的位置替换成","

5.2.1弄出来最后一个逗号

正则:/(?=\d{3}$)/

var result = "12345678".replace(/(?=\d{3}$)/g, ',')console.log(result);// 12345,678

其中(?=\d{3}$)匹配\d{3}$前面的位置。而\d{3}$匹配的是目标字符串最后那3为数字。

5.2.2弄出来多有逗号

因为逗号的出现的位置,要求后边3个数字一组,也就是\d{3}至少出现1次。

可以使用量词 + :

var result = "12345678".replace(/(?=(\d{3})+$)/g, ',')console.log(result);// 12,345,678

5.2.3匹配其余案例

写完正则后,是需要举个别案例来验证的,就会发现问题:

var result = "123456789".replace(/(?=(\d{3})+$)/g, ',')console.log(result);// ,123,456,789

上面的正则,仅仅是表示把从结尾向前数,一旦是3的倍数买酒吧前面的位置替换为逗号。

还需要要求:匹配的这个位置不能是开头。

我们知道开头的匹配是使用^,但是不是开头怎么整?

使用(?!^)

var regex = /(?!^)(?=(\d{3})+$)/g;var result = "12345678".replace(regex, ',')console.log(result);// "12,345,678"result = "123456789".replace(regex, ',');console.log(result);// "123,456,789"

5.2.4支持其他形式

如果要把 "12345678 123456789" 替换成 "12,345,678 123,456,789"。

此时我们需要修改正则,把里面的开头 ^ 和结尾 $,修改成 \b:

var string = "12345678 123456789",regex = /(?!\b)(?=(\d{3})+\b)/g;var result = string.replace(regex, ',')console.log(result);// "12,345,678 123,456,789"

其中(?!\b)怎么理解?

要求是当前的一个位置,但不是\b前面的位置,其实(?!\b)说的是\B。

因此最终正则变成了:/\B(?=(\d{3})+\b)/g。

可视化形式:

RegExp:/\B(?=(\d{3})+\b)/g

5.2.5货币格式化

千分符表示法一个常见的应用就是货币格式化。

把这个字符串:

格式化:

$ 1888.00

实现:

function format (num) {return num.toFixed(2).replace(/\B(?=(\d{3})+\b)/g, ",").replace(/^/, "$ ");};console.log( format(1888) );// "$ 1,888.00"

5.3验证密码的问题

密码长度6-12,由数字,小写字母,大写字母组成,但必须至少包括2种字符。

写成多个正则来判断,比较容易,但是要写成一个正则就比较困难。

来看看我们对于位置的理解是否深刻。

5.3.1简化

暂时不考虑"必须至少包含2种字符"这个条件,可以容易写出:

var regex = /^[0-9A-Za-z]{6,12}$/;

5.3.2判断是否包含有某一种字符

假设,要求我们必须包含数字,怎么整?此时我们可以使用(?=.*[0-9])来实现。

正则变成:

var regex = /(?=.*[0-9])^[0-9A-Za-z]{6,12}$/;

5.3.3同时包含具体两种字符

比如同时包含数字和小写字母,可以使用(?=.*[0-9])(?=.*[a-z])来实现。

正则变成:

var regex = /(?=.*[0-9])(?=.*[a-z])^[0-9A-Za-z]{6,12}$/;

5.3.3具体实现

把原题变成下列几种情况:

1、同时包含数字和小写字母;

2、同时包含数字和大写字母;

3、同时包含小写字母和大写字母;

4、同时包含数字,小写字母和大写字母。

以上的4中情况是 的关系(实际上,第四条可以不用)。

最终答案:

var regex = /((?=.*[0-9])(?=.*[a-z])|(?=.*[0-9])(?=.*[A-Z])|(?=.*[a-z])(?=.*[AZ]))^[0-9A-Za-z]{6,12}$/;console.log( regex.test("1234567") ); // false 全是数字console.log( regex.test("abcdef") ); // false 全是小写字母console.log( regex.test("ABCDEFGH") ); // false 全是大写字母console.log( regex.test("ab23C") ); // false 不足6位console.log( regex.test("ABCDEF234") ); // true 大写字母和数字console.log( regex.test("abcdEF234") ); // true 三者都有

可视化形式:

RegExp:/((?=.*[0-9])(?=.*[a-z])|(?=.*[0-9])(?=.*[A-Z])|(?=.*[a-z])(?=.*[AZ]))^[ 0-9A-Za-z]{6,12}$/

分析:

上面正则看起来好复杂,只需要理解第二步,/(?=.*[0-9])^[0-9A-Za-z]{6,12}$/;

对于这个正则,我们需要明白(?=.*[0-9])^这个;

分开来看就是(?=.*[0-9]) 和 ^。

表示开头前面还有个位置(当然也是开头,即同一个位置,想想之前的空字符类比)。

(?=.*[0-9]) 表示该位置后面的字符匹配。

.*[0-9],即,有任何多个任意字符,后面再跟个数字。

翻译成大白话,就是接下来的字符,必须包含个数字。

5.3.4另外一种解法

"至少包含两种字符"的意思就是说,不能全部都是数字,也不能全部都是小写字母,也不能全部都是大写字母。

那么要求"不能全部都是数字",怎么做呢? (?!p) 出马!

对应的正则:

var regex = /(?!^[0-9]{6,12}$)^[0-9A-Za-z]{6,12}$/;

三种"都不能"呢?

最终答案是:

var regex = /(?!^[0-9]{6,12}$)(?!^[a-z]{6,12}$)(?!^[A-Z]{6,12}$)^[0-9A-Za-z]{6,12}$/;console.log( regex.test("1234567") ); // false 全是数字console.log( regex.test("abcdef") ); // false 全是小写字母console.log( regex.test("ABCDEFGH") ); // false 全是大写字母console.log( regex.test("ab23C") ); // false 不足6位console.log( regex.test("ABCDEF234") ); // true 大写字母和数字console.log( regex.test("abcdEF234") ); // true 三者都有

可视化形式:

RegExp:/(?!^[0-9]{6,12}$)(?!^[a-z]{6,12}$)(?!^[A-Z]{6,12}$)^[0-9A-Za-z]{6,12}$/;

上述就是小编为大家分享的怎么在javascript中使用正则表达式实现位置匹配了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

位置 字符 字母 数字 正则 之间 开头 大写 大写字母 小写 就是 也就是 同时 形式 字符串 逗号 分析 可视化 表达式 单词 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 闵行区软件开发技术值多少钱 sql安全性链接服务器 手机服务器无响应怎么啦 软件开发培训班真实收入 请问一下网络安全龙头股 网络技术服务合同书 网络安全风险架构 正式服魔兽怎么找的服务器的人 此服务器上找不到url怎么找 机关单位网络安全工作内容及职责 对于网络安全事件 评价 企业网络安全重点工作 海康远程服务器重开资源管理器 27国签署网络安全 想学网络技术培训班 家庭服务器网络拓扑 数据库大量数据慢 阿里云数据库配置负载均衡 武汉图像识别软件开发 单位网络安全隐患 网络安全员资料 石嘴山app软件开发哪家专业 IDE集成软件开发工具 网络技术大学考哪些证书 寻甸专业性软件开发厂家价格 深圳星科软件开发有限公司 计算机三级网络技术网课分享 机器视觉还是软件开发 中国网络安全垄断地位第一股 计算机网络技术女孩子学起来难吗
0