js正则详情

一、原子(可以分微可见原子和不可见原子)

    1、可见原子

  • 标点;”、/ ?.等等
  • 英文字母数字a-z, A-Z, 0-9
  • 汉字、韩文、日文、阿拉伯文等
  • ∑ π ∩ ∈ △ 等数理化符号
  • 其他可见字符

    2、不可见原子

        换行符 \n 回车 \r 制表符 \t  空格、其他不可见符号

二、元字符

1、原子的筛选方式

匹配两个或多个分支选择
[ ]匹配方括号汇总任意一个原子
[^ ]匹配除方括号中原子以外的任意字符
/ab|cd/.test('abcde')
// true
/[123]/.test('abc45')
//匹配123中任意一个
//false
/[^123]/.test('abc45')
//匹配非123以外的字符
//true
/[12^3]/.test('abc^45')
//true
/[a-gA-Z3-6]/.test('12yxz')
//false

 需要注意的是

如果^不在首位的话就当普通字符匹配了

2、原子集合和量词

        

.匹配除换行之外的任意字符,即 [^\n]
\d匹配任意一个十进制数字,即 [0-9]
\D匹配任意一个非十进制数字,即 [^0-9]
\s匹配一个不可见的原子, 即 [\f \n \r \t \v]
\S匹配一个可见的原子, 即 [^\f \n \r \t \v]
\w匹配任意一个数字、字母、下划线,即 [0-9a-zA-Z_]
\W匹配任意非一个数字、字母、下划线,即 [^0-9a-zA-Z_]
x{n}表示x刚好出现n次
x{n, }表示x至少出现n次
x{n, m}表示x在n和m次之间,包含
x*匹配大于等于0次, 即x{0, }。 x*? 即x{0}
x+匹配大于等于1次, 即x{1, }。 x+? 即x{1}
x?匹配等于0次或1次, 即x{0, 1}
\b匹配字的边界,即字和空格之间位置
\B匹配非字的边界
\f匹配换页字符
\n匹配换行字符
\r匹配回车字符
\t匹配制表字符
\v匹配垂直制表符
x*?匹配0个x
x+?匹配1个x

3、分组 

(x)分组,并且记录匹配到的字符串'abcd'.match(/(abc)/)
\n使用分组(x)匹配到的字符串/(a)\1(b)\2/.test('aabb')
(?:x)仅分组,不记录,'abc'.match(/(?:ab)/)
(?=x)分组匹配x之前的字符串并记录`com">`.match(/^.{1,10}(?=(">))/)
(?<=x)分组匹配x之后的字符串并记录`="www.`.match(/(?<==").{1,10}$/)
(?!x)分组匹配不是x之前的字符串并记录
(?<!x)分组匹配不是x之后的字符串并记录
(?<name>x)分组匹配x并放到name的组中
x$匹配任何结尾为 x 的字符串
^x匹配任何开头为 x 的字符串

注意()中会当做一个原子来看待

三、方法

1、RegExp对象属性

1、global
/abc/g.test('abcedf')
//true

2、ignoreCase
/abc/gi.test('ABcedf')
//true

3、multiline
/abc/gim.test('abc\n')
//true

4、source
/abc/g.source
//返回abc

2、RegExp 对象的方法

        compile、exec、test、toString.

/abc/.exec("abcde");
// "abc"

/abc/.test("abcde");
//true

/abc/.toString(); 
//"/abc/"

var reg = /abc/; reg.compile("def");
reg.test("def");

//true

3、支持正则表达式的 String 对象的方法

        search、match、replace、split

'abcabcdef'.search(/(abc)\1/); 
//0

"aabbbcc".replace(/b+?/, "1");
//"aa1bbcc"

"aabbc".replace(/b*?/g, "1");
//"1a1a1b1b1c1"

"aabbbbccbbc".match(/b+/g);
//["bbbb", "bb"]

"aabbbccbbaabbdd".split(/b+/g);
//["aa", "cc", "aa", "dd"]

四、应用

之前项目中,有需要把数字,每三个数字加一个逗号,先自己写了个有循环的方法,在去网上查,发现只要一条正则就可以解决

function toThousands(num) {
    return (num || 0).toString().replace(/(\d)(?=(?:\d{3})+$)/g, '$1,');
}

function myFun(num) {
    return (num || 0).toString().replace(/b*?(?=(\d{3})+$)/g, ",").replace(/^,/, '');
}

第一函数是网上查来的,replace第二个参数中$1匹配正则中第一个记录的()中字符。

参考所学的正则知识,自己手写了第二个myFun函数,意思是以3个数字结尾的前面加“,”,但是不能取消开头的,只能写两个正则。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值