例子1:数字从右边每三个插入逗号(1,234,567,891)
正则表达式:(?<=\d)(?=(\d{3})+(?!\d))
let str = '1234567891'
let check = /(?<=\d)(?=(\d{3})+(?!\d))/g
let finalValue = str.replace(check, ',')
console.log(finalValue)
或者
let reg = /\B(?=(\d{3})+(?!\d))/g
let num = 1225300
let result = num.toString().replace(reg, ',') //1,225,300
打印结果:
解释:插入逗号的位置是,左边有数字,右边是三的倍数的数字字符组,/g 表示该表达式将用来在输入字符串中查找所有可能的匹配,返回的结果可以是多个。如果不加/g最多只会匹配一个。
环视四种情况:
(?=…) | 肯定顺序环视 | 右侧 |
---|---|---|
(?!..) | 否定顺序环视 | 右侧 |
(?<=…) | 肯定逆序环视 | 左侧 |
(?<!..) | 否定逆序环视 | 左侧 |
例子2: 去掉中英文混排中的空白字符
1.用否定顺序/逆序环视(正确)
let str = ' 中英文 混排,some English word,有多余 空白字符 '
let check = /(?<![a-zA-Z])\s+(?![a-zA-Z])/g
let finalValue = str.replace(check, '')
console.log('[' + finalValue + ']')
1.用肯定顺序/逆序环视(匹配不到开头和结尾的空白字符,因为它需要左右两边都是非字母的字符,开头和结尾的空白字符缺少某一边有非字母字符这一条件,所以匹配不到)
let str = ' 中英文 混排,some English word,有多余 空白字符 '
let check = /(?<=[^a-zA-Z])\s+(?=[^a-zA-Z])/g
let finalValue = str.replace(check, '')
console.log('[' + finalValue + ']')
输出结果
例子3: 电子邮件中,更准确的主机名验证
规范:主机名以点分隔为多个域名字段,每个域名字段可以包含大小写字母/数字字母/横线,但是横线不能出现在最开头的位置。每个域名字段的长度最多为63个字符,整个主机名的长度最多为255个字符。
通常的表达式是:
([a-zA-Z0-9]{1,63}\.)*[-a-zA-Z0-9]{1,63}
当前表达式有问题:
1.它容许域名字段的第一个字符是横线-
2.他没有限定整个主机名的长度最长为255个字符
最终结果:
/^(?=[-a-zA-Z0-9.]{0,255}(?![-a-zA-Z0-9.]))((?!-)[-a-zA-Z0-9]{1,63}\.)*((?!-)[-a-zA-Z0-9]{1,63})$/
环视的组合
1.环视中包含环视
2.并列多个环视 例: (?!999)(?=\d+) 两个条件都要满足
3.环视作为多选分支排列在多选结构中 例: ((?\d)|(?=\d\D)) 只要有一个条件满足就可以
断言和反向引用间的关系
1.反向引用时不会保留断言的判断
如(\bcat\b)\s+\1 这时\1匹配的不止cat 还能匹配cate 之类的里面的cat,正确的做法是在反向引用的两边也加上单词边界符,如:(\bcat\b).*?\b\1\b
不区分大小写匹配模式
/check/i
例子四
密码检验,至少包含大、小写字母、数字、字符三种字符,8-16位
let regu =/^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\\W_]+$)(?![a-z0-9]+$)(?![a-z\\W_]+$)(?![0-9\\W_]+$)[a-zA-Z0-9\\W_]{8,16}$/;
if (regu.test(s)) {
console.log(true)
} else {
console.log(false)
}
部分语法解释
语法 | 说明 |
---|---|
\w | 单词字符 |
\W | 非单词字符 |
\b | 匹配\w和\W之间的边界位置 |
\B | ^\b(匹配单词字符和单词字符边界位置或者非单词字符和非单词字符边界) |
正则的常用方法等
1.定义正则,g、i、m,分别代表全局匹配、忽略大小写、多行模式。三种属性可以自由组合共存
var re = new RegExp(“\d{3}”); //RegExp对象。参数就是我们想要制定的正则规则。有一种情况必须用这种方式
var re = /\d{3}/g; // 简写方法 推荐使用 性能更好
2.常用方法
test()//查找,有则返回true,没有则返回false
if(re.test('123456')) {
return true
} else {
return false
}
search()//在字符串搜索符合正则的内容,搜索到就返回出现的位置,否则返回-1(有点像indexOf)
let str = 'abcdefg'
let re = /de/i //i是忽略大小写的意思
console.log(str.search(re)); //3
match() // 在字符串中搜索符合正则规则的内容, 成功返回内容,数组格式,失败则返回null
例1:
let str = '123456abcdHello'
let re = /\d+/g // 搜索至少包含一个数字的数字,g是全局搜索
console.log(str.match(re)) // [123456]
例2:
let str = '{123}{456}'
let reg = /\{(.+?)\}/g
console.log(str.match(reg)) //['{123}','{456}']
replace() // 查找并替换
//1.常见
let str = 'Hello, 你吃饭了吗?'
let reg = /Hello/g
console.log(str.replace(reg, '你好')) // 你好,你吃饭了吗?
//2. 包含$1,$2
//把 "Doe, John" 转换为 "John Doe" 的形式:
//$1,$2上就是按顺序对应小括号里面的小正则 捕获到的内容。
let str = "Doe, John";
str.replace(/(\w+)\s*, \s*(\w+)/, "$2 $1"); //John Doe
//3.第二个参数是函数
//把字符串中所有单词的首字母都转换为大写:
var str = 'aaa bbb ccc';
uw=str.replace(/\b\w+\b/g, function(word){
return word.substring(0,1).toUpperCase()+word.substring(1);}
); //'Aaa, Bbb, Ccc'
exec()//和match方法一样,搜索符合规则的内容,并返回内容,格式为数组。用法:正则.exec(字符串);
var testStr = "now test001 test002";
var re = /test(\d+)/g;
var r = "";
//匹配两次 每次匹配都接着上一次的位置开始匹配,一直匹配到最后r就为false,就停止匹配了 匹配到test001 test002
while(r = re.exec(testStr)){
console.log(r); //返回每次匹配成功的字符串,以及子项,分别打印 :test001 001,test002 002
console.log(r.input); //分别弹出: now test001 test002 now test001 test002
console.log(r[0]); //代表每次匹配成功的字符串 分别打印: test001 test002
console.log(r[1]); //代表每次匹配成功字符串中的第一个子项 (\d+) 分别打印:001 002
console.log(r.index ); // 每次匹配成功的字符串中的第一个字符的位置,分别打印:4 12
console.log(r.length); //分别打印:2 2
}