js正则表达式的构成,表达式到底该如何表达(带案例)?

发布于:2020-03-27 17:36:19

正则表达式构成

正则表达式由普通字符(例如字母)和特殊字符(例如+)构成,组成的文字模式。

1.字符匹配符

\s : 空格
\S : 非空格
\d : 数字
\D : 非数字
\w : 字符 ( 字母 ,数字,下划线_ )
\W : 非字符例子:是否有不是数字的字符
[xyz]: 匹配x,y,z任意一个字符, 例如[23w]
[^x,y,z]: 匹配不包含x,y,z的字符, 例如[^12w]
[a-z]: 匹配a-z之间的任意字符, 例如[1-5]
[^a-z]匹配非a-z之间的任意字符, 例如[^1-5]

2.限定符

* : 匹配>=0次
+ : 匹配>=1次
? : 匹配0或1次
{n} : 匹配n次
{n, } : 匹配至少n次
{n, m} : 匹配至少n次,最对m次

注意: 正则表达式很贪婪的,所以他会尽可能的多的去匹配, 凡是限定符后面紧跟? , 则他会减少贪婪的欲望.

3.定位符

^ : 匹配字符串开始的位置
$ : 匹配字符串结束的位置
\b : 匹配单词的边界, 就是单词和空格之间的位置
\B : 匹配非单词边界

4.转义字符

: 转义某也特殊的字符, 例如匹配$符号

5.逻辑字符

| : 表示或,匹配多个规则

6.特殊用法

() : 捕获型分组,即子表达式,使用\1,\2,\3…对子组的引用
(?:pattern) : 非捕获型分组.匹配pattern但不获取匹配结果。也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 “或” 字符 (|) 来组合一个模式的各个部分是很有用。

(?=pattern) : 前瞻--正向预查,在任何匹配pattern的字符串开始处匹配字符串.非获取字符串.就是匹配pattern字符串,但不返回pattern,返回的是与pattern匹配的字符串但要把pattern去掉。
(?!pattern) : 负前瞻--负向预查,匹配与正向预查相反,返回的是不是匹配到pattern的值,也就是正向预查的补集。

(?<=exp2)exp1:后顾--反向预查, 查找exp2后面的exp1
(?<!exp2)exp1:负后顾--负反向预查 查找前面不是exp2的exp1

二、运用正则表达式的构成到底如何表达?

1.js正则表达式实现邮箱星号处理。

如果@前面的字符少于四位,则原邮箱输出。如果大于四位则四位后面到@中间的字符依次替换成星号*;

如:xiaogou123@qq.com

处理后:xiao**@qq.com

var reg = /(?<=(\w{4}))\w+?(?=\w*@)/g;
var str = 'dhfasjf@123f.com';
console.log(str.match(reg));//["s", "j", "f"]
str.replace(reg,"*") ;//结果:"dhfa***@123f.com"
/**
@前面字符数量大于4个:

第一、(?<=(\w{4}))\w+?表示返回前面是四个字符并且后面接着一个字符,也就是"s", "j", "f"。

第二、(?=\w*@)表示接着(?<=(\w{4}))\w+?匹配到一个字符后可以紧跟着任意个字符,并且以@结束。

第三、(?<=(\w{4}))和(?=\w*@)都属于非捕获型匹配,所以每次匹配到值都只返回\w+?所匹配到的,最后全局匹配到三个["s", "j", "f"]。

第四、str.replace(reg,"*") 依次将'dhfasjf@123f.com'的"s", "j", "f"替换成*;

第五、结果:"dhfa***@123f.com"

@前面字符数量小于等于4个:
没有匹配到,结果console.log(str.match(reg));//null
所以不进行replace操作,原样输出。

**/

结果: js正则表达式实现邮箱星号处理

2.js正则表达式实现数字千分位分割。

var reg = /\B(?=(\d{3})+(?!\d))/g;
var str = "1234567";
console.log(str.match(reg));//["", ""]匹配出两个非单词边界
str.replace(reg,",") // 结果:"1,234,567",匹配的是后面是3*n个数字的非单词边界(\B)
/*
 匹配后面紧接着3个数字的----非单词边界符,(\d{3})+ 表示并且至少重复一次,默认为贪婪匹配,如果有多个会尽可能多的匹配。

 后面继续(?!\d),表示匹配到多组三个数字的后面不能再跟数字,意思就是:

 如"123,456,7",如果非单词边界符在3和4之间开始匹配分割,则456后面有数字为7,不符合。

 如"1,234,567",如果非单词边界符在1和2之间开始匹配到分割,则234后继续重复(\d{3})一次到567符合,再继续匹配后面非数字(?!\d)也符合,7后面没有数字了。

 * 
 * */

结果:

js正则表达式实现数字千分位分割

标签: javascript,JS正则
评论

点赞

收藏

0/500 字数

发布

取消