一、前言
正则表达式是匹配的模式,要么匹配字符,要么匹配位置。
事实上,匹配位置在开发中很少使用。本文主要包括:
二、地点是什么
位置:相邻字符之间的位置。
第三,如何匹配位置
在ES5中,有6个锚点:$, b, b,(?=p),(?p)
可视化形式:
RegExp:/^$bB(?=a(?b)/g
3.1和$
(插入符号)匹配开头,并匹配多行匹配中的行首。
$(美元符号)匹配结尾,并在多行匹配中匹配一行的结尾。
例如,我们用#替换字符串的开头和结尾(位置可以用字符替换):
var结果='hello '。replace(/^|$/g,' # ');console.log(结果);//'#hello# '当多条线匹配模式(带修饰符m)时,它们就是线的概念,所以我们需要注意:
var结果='Inlovenjavascript '。replace(/^|$/gm,' # ');console.log(结果);//# I #//# love #//# JavaScript # 3.2 B和 B
b是单词边界,具体是w和W之间的位置,包括w和$之间的位置。
例如,查看文件名“[JS]Level _ 01 . MP4”中的b,如下所示:
var结果='[JS]课目_01.mp4 '。替换(/b/g,' # ');console.log(结果);//'[# JS #]#教训_01#。#mp4# '首先,我们知道w是字符组[0-9a-zA-Z]的缩写,即使它是字母数字或下划线中的任何字符。而W是字符组[0-9a-za-z]的缩写,即W是w以外的任意字符.
让我们看看#是如何产生的:
第一,两边的字符是'['和' j ',这是W和w之间的位置.
第二,两边的字符是' s '和']',即w和 w之间的位置。
第三,两边的字符是空格和‘l’,也就是W和 w之间的位置。
第四,两边的字符是“1”和“.”,即w和 w之间的位置。
第五,两边的字都是“.”和“m”,即W和 w之间的位置
第六个,在结尾,前面的字符' 4 '是w,也就是w和$之间的位置。
知道b的概念后,很容易理解B是词边界,b是非词边界
var结果='[JS]课目_01.mp4 '。替换(/B/g,' # ');console.log(结果);//' #[J # S]# L # e # S # S # o # n # _ # 0 # 1 . m # p # 4 ' 3.3(?=p)和(?p)
(?=p)其中p是子模式,即p前面的位置(该位置后面的字符应与p匹配)
例如:(?=e),表示e字符前面的位置;
var结果='hello '。替换(/(?=l)/g,' # ');console.log(结果);//‘he # l # lo’和(?p)是(?=p的否定意义)
var结果='hello '。替换(/(?l)/g,' # ');console.log(结果);//'#h#ell#o# '是一个正的和一个负的。
汉语翻译分别是肯定先行断言和否定先行断言。
ES5之后的版本将支持positivelookbehind和negativelookbehind。
具体来说(?=p)和(?p ).
四.位置特征
对于位置的理解,我们可以把金额累加成一个空字符' '。
例如,“hello”字符串相当于以下形式:
你好'==' ' ' h ' ' ' ' e ' ' ' ' l ' ' ' ' l ' ' ' ' o也相当于
Hello'=='' '' 'hello '因此,将/^^hello$$$/写成/hello $ $/没有问题:
var结果=/^^hello$$$/.测试(' hello ');console.log(结果);//true,即字符之间的位置可以写成倍数。
注意:通过理解空字符来理解位置是非常有效的方法
五.相关案件
5.1不符合任何事物的规律性
/.^/
规律性只需要一个字符,但是这个字符后面是开头,这样的字符串是不存在的。
5.2千个数字的分隔符表示
比如12345678变成了12345678。
分析:需要将对应的位置替换为','
5.2.1去掉最后一个逗号
常规:/(?=d{3}$)/
var结果='12345678 '。替换(/(?=d{3}$)/g,',')console.log(结果);//12345678其中(?=d{3}$)匹配d{3}之前的位置。和d{3}$匹配目标字符串的最后3位数字。
5.2.2出来的时候有很多逗号。
由于逗号出现的位置,要求有一组3个数字,也就是说,d{3}至少出现一次。
您可以使用量词:
var结果='12345678 '。替换(/(?=(d{3}) $)/g,',')console.log(结果);//12,345,6785.2.3匹配其他案例
写完规律性,就要给个例去验证,你会发现问题:
var结果='123456789 '。替换(/(?=(d{3}) $)/g,',')console.log(结果);//,123,456,789是常规的,这仅仅意味着一旦它是3的倍数,就用逗号替换条形前面的位置。
还要求这个匹配的位置不能是开始。
我们知道一开始的匹配是用0,但是一开始怎么纠正呢?
使用(?)
var regex=/(?^)(?=( d { 3 })$)/g;var结果='12345678 '。replace(regex,',')console.log(结果);//'12,345,678 '结果='123456789 '。替换(正则表达式,',');console.log(结果);//'123,456,789'5.2.4支持其他形式
如果要将“12345678123456789”替换为“12,345,678123,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 .
可视化形式:
正则表达式:/B(?=(d{3}) b)/g
货币格式
千分记数法的一个常见应用是货币格式化。
把这个字符串:
格式:
$ 1888.00
实现:
函数格式(num) {return num.toFixed(2)。替换(/B(?=(d{3}) b)/g,',')。replace(/^/,' $ ');};console.log(格式(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}$/;具体实现
将原问题转化为以下几种情况:
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(' abcdef 234 '));//真大写字母和数字console . log(regex . test(' abcdef 234 '));//真的都有视觉形式:
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(' abcdef 234 '));//真大写字母和数字console . log(regex . test(' abcdef 234 '));//真的都有视觉形式:
RegExp:/(?^[0-9]{6,12}$)(?^[a-z]{6,12}$)(?^[a-z]{6,12}$)^[0-9a-za-z]{6,12}$/;
摘要
以上是边肖介绍的javascript正则表达式学习的位置匹配。希望对大家有帮助。如果你有任何问题,请给我留言,边肖会及时回复你。非常感谢您对我们网站的支持!如果你觉得这篇文章对你有帮助,请转载,请注明出处,谢谢!