首页 > 其他分享 >js正则中的 ^(脱字符) 与 $(美元符号)的含义

js正则中的 ^(脱字符) 与 $(美元符号)的含义

时间:2022-10-21 10:36:10浏览次数:43  
标签:字符 匹配 位置 js 正则 123 开头

壹 ❀ 引

在学习js正则中发现了这篇讲解 ^与$ 在正则中的作用,分析的很清晰,由此进行转载分享。如有侵权,请联系笔者删除!

本文转自:博客园听风是风

原文出处: https://www.cnblogs.com/echolun/p/12074720.html

壹 ❀ 引

对于初学正则的同学来说,^这两个看似简单的字符却在使用中总让匹配结果超出我们的预期,^什么时候表示行首什么时候表示反义?^这两个看似简单的字符却在使用中总让匹配结果超出我们的预期,^什么时候表示行首什么时候表示反义?^两个一起写表示什么含义?今天我们就来详细聊聊这两个字符。

 贰 ❀ 关于^与$

先解释^与$概念,很简单的两句话,先留个印象。

^ 脱字符:匹配开头,若存在多行匹配多行的行头。

$ 美元符:匹配尾部,若存在多行匹配多行的尾部。

我们知道正则是一种匹配模式,要么匹配字符,要么匹配位置。这里我们得从这两种匹配情况分别解释这两个字符。

1.从匹配字符角度

当用于匹配字符时,^与$更多是作为匹配出精准结果的辅助条件,我们先看个简单的例子:

'123'.match(/\d/g);//[1,2,3]

很好理解,全局(注意结尾有个g)匹配单个任意数字,很明显1,2,3都符合条件,所以这里找到了三个匹配结果;我们分别添加 ^ 与 $ 再看:

'123'.match(/^\d/g);//[1]
'123'.match(/\d$/g);//[3]

此时 ^\d 只能匹配到1,而 \d只能匹配到3,你肯定就纳闷了,不对啊,我正则后面不是有个g表示全局匹配吗,怎么只匹配一个了呢?以\d为例,此时的匹配条件其实是找开头位置后的一个任意数字,\d只能匹配到3,你肯定就纳闷了,不对啊,我正则后面不是有个g表示全局匹配吗,怎么只匹配一个了呢?以\d为例,此时的匹配条件其实是找开头位置后的一个任意数字,\d 表示匹配结尾前的一个任意数字。开头和结果对于一个不换行的字符串都只有一个,所以自然只能找到一个数字了,现在能理解前面所说的^$作为辅助条件的意思了吗。

那么我们现在将数字换行,再看:

'12\n34'.match(/^\d/mg);//[1,3]
'12\n34'.match(/\d$/mg);//[2,4]

由于存在换行,导致现在有两个开头位置和两个结尾位置(注意匹配中使用了m,表示换行匹配),所以匹配结果也变成了两个,不难理解吧。

2.从匹配位置角度

正则除了根据规则匹配对应的字符,还有一个强大的功能就是匹配位置。什么是位置呢?以字符 1234 为例,每个箭头都代表一个位置,其中第一个箭头的位置就是 脱字符 ^,结果位置就是美元符$, 如下图:

所以当我们在匹配位置时,^$也成为了我们需要匹配的结果,例如,我需要将 1234 首尾位置加上花朵:

'1234'.replace(/^|$/g, '❀');// "❀1234❀"

当然,在匹配位置时^与$也是帮助我们精确位置的辅助条件,比如常用的千位分隔符正则:

'12345678'.replace(/(?!^)(?=(\d{3})+$)/g, ',');// "12,345,678"

这段正则的意思,就是从右往左找,每隔三位数字前面的位置替换成逗号,同时排除字段头部位置,因为当不排位开头位置,只要字符长度是三的倍数,就会导致头部也会出现逗号的尴尬局面,例如:

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

所以针对千位分隔符正则中的 ^ 与 而言,起到了排除开头位置的作用,而而言,起到了排除开头位置的作用,而起到了改变正则匹配的方向,由默认的从左到右变成了从右到左每隔三位的查找。

3.反义字符组

^除了作为脱字符表示从头匹配,开头位置两个含义外,还能作为反义字符使用,例如,我想匹配除了123之外的任意字符:

/[^123]/.test(1); //false
/[^123]/.test(2); //false
/[^123]/.test(3); //false
/[^123]/.test(4); //true

这里[^123]就表示除了123之外的意思,那么我们怎么知道^什么时候表示反义,什么时候表示开头位置呢?很简单,因为当它只有放在字符组中时才叫反义字符组,所以当然是只有出现在[]中时才是反义的意思。

4.^与$同时出现在正则前后表示什么?

对于新手而言,^同时出现确实有点误解人,毕竟我们前面说表示从左到右,同时出现确实有点误解人,毕竟我们前面说表示从左到右,能起到从右到左的作用,同时出现难道匹配左右夹击?其实同时写时只是限制字符的起点与终点,我们来看个例子:

/123/.test('   123   '); //true
/^123$/.test('   123   '); //false

 第一个输出true,这是因为被检测的字段只要有123这三个字段就行了,不关心你123前后还有什么。而第二个我们利用^限时了字符的两端,也就是说如果你test想为真,那么你的字符开头后面必须是1,结尾前面必须是3,字符的开头结尾被固定死了。一般在验证表单输入是否正则,我们都会加上^限时了字符的两端,也就是说如果你test想为真,那么你的字符开头后面必须是1,结尾前面必须是3,字符的开头结尾被固定死了。一般在验证表单输入是否正则,我们都会加上^。

标签:字符,匹配,位置,js,正则,123,开头
From: https://www.cnblogs.com/zy-feng/p/16812616.html

相关文章

  • 两个字符串的乘法
    见leetcode43 Giventwonon-negativeintegers num1 and num2 representedasstrings,returntheproductof num1 and num2.Note:Thelengthofboth nu......
  • 细说nodejs的path模块
    前言path模块是nodejs中用于处理文件/目录路径的一个内置模块,可以看作是一个工具箱,提供诸多方法供我们使用,当然都是和路径处理有关的。同时在前端开发中path模块出现......
  • 遇到的jstl标签库与tomcat 10服务器相关问题
    在写项目的时候,JSP页面引用核心标签库语句<%@tagliburi="http://java.sun.com/jsp/jstl/core"prefix="c"%>运行后报错在tomcat10使用jstl的时候产生如下错误:HTTP状态......
  • 初识字符串
    社么是字符串由双引号括起来的一串字符叫做字符串字符串的标志是由\0以结束标语的,以\0为结束标志,字符串长度不变  没有引用头文件     字符串结束标志......
  • Blazor组件自做十 : 光学字符识别 OCR 组件
    光学字符识别OCR组件演示地址https://blazor.app1.es/ocr使用方法手机或者电脑点击拍照OCR可启动相机拍照,或者点击文件OCR选择文件,稍等片刻即可获得OCR结果.......
  • 同构字符
    同构字符一、题目描述给定两个字符串,判断是否时两个同类型的字符串。同类型指的时如ABB,ABAB等。实例:输入:s="egg",t="add"输出:true输入:s="foo",t="bar"输......
  • 每日算法:驼峰转换,判断连续字符
    每日算法今日是:1、将字符串转换为驼峰格式2、判断字符串中是否有连续重复的字符将字符串转换成驼峰格式//css中经常有类似background-image这种通过-连接的字......
  • jmeter BeanShell 后置处理器 提取json数组,重新组装后供下一个接口使用
    前置条件:在jmeter中使用Json需要先下载一个json包放到jmeter安装路径下的lib\ext下我这里用的是json-20140107.jar我已经放到了百度网盘上,需要的可以自取:链接:https://p......
  • js给定两个数组,写一个方法来计算它们的交集?
    JavaScript给定两个数组,写一个方法来计算它们的交集   查看代码varnums1=[1,2,2,1,0],     nums2=[2,2,3,4,0];   ......
  • jmeter 提取json数组中的所有key相同的值,并返回数组
    接口响应数据如下:{"msg":"ok","result":{"total":5530,"num":2,"list":[{"classid":2,......