js正则

前言

具体视频请看慕课网javascript教程

Regexp对象

实例化regexp对象的两种方式:

  1. 字面量:var reg=/\bis\b/g (\b单词边界)
  2. 构造函数: var reg= new RegExp(’\bis\b’, ‘g’) (第一个参数字符串,\特殊字符需转义)

修饰符

g:global全局搜索,不添加搜索第一个匹配后停止
i:ignore case 忽略大小写,不写大小写敏感
m:multiline 多行搜索

元字符

  1. 原义文本字符:如 abc123
  2. 元字符: 在正则表达式有特殊含义,需转义的字符 . * + ? $ ^ . | \ ( ) { } [ ]
字符含义
\t水平制表符
\v垂直制表符
\h换行度
\r回车符
\o空字符
\f换页符
\cx与x对应的控制字符(ctrl+x)

字符类

[ ] 用来构建一个类,类是泛指符合某些特性的对象。
如 [abc] 把字符a或者b或者c归为一类,表达式可以匹配这类字符。有他们其中的任意一个就行

'a1b2c3d4'.replace(/[abc]/g, 'X'); // X1X2X3d4

字符类取反

使用 ^ 创建反响类,指不属于某类的内容
如 [^abc] 表示不是a或b或c的内容

'a1b2c3d4'.replace(/[^abc]/g, 'X'); // aXbXcXXX

范围类

使用字符类来匹配数字的正则 [0123456789]

[a-z] 包含a到z任意字符,包含a和z本身
[a-zA-Z] 类的内部是可以连写的,匹配a到z,A到Z的字符

'2016-09-12'.replace(/[0-9]/g, 'A'); // AAAA-AA-AA

如何匹配横线 -

'2016-09-12'.replace(/[0-9-]/g, 'A'); // AAAAAAAAAA

预定义类

匹配常见的字符类:

字符等价类含义
.[^\r\n]除了回车符和换行符之外的任意字符
\d[0-9]数字字符
\D[^0-9]非数字字符
\s[\t\n\x0B\f\r]空白符
\S[^\t\n\x0B\f\r]非空白符
\w[0-9a-zA-Z_]单词字符(大小写字符、数字、下划线)
\W[^0-9a-zA-Z_]非单词字符

demo: 匹配ab+数字+任意字符的字符串-

/ab[0-9][^\r\n]/
/ab\d./   //书写简便

边界

字符含义
^以XXX开头
$以XXX结尾
\b单词边界
\B非单词边界

demo:
“@123\r@345\r@789” 想匹配 @+数字

"@123\r@345\r@789".replace(/^@\d/g, 'X'); //"X23@345@789"
"@123\r@345\r@789".replace(/^@\d/gm, 'X'); //"X23X45X89"

量词

字符含义
出现0次或1次(最多一次)
+出现1次或多次(至少出现1次)
*出现0次或多次(任意次)
{n}出现n次
{n,m}出现n到m次
{n,}至少出现n次

demo:要求匹配一个连续出现的数字20的内容 \d{20}

贪婪模式

正则表达式尽可能多的匹配,直到匹配失败

"12345678".replace(/\d{3,6}/g, 'X');  //"X78"

非贪婪模式

如有需求,让正则表达式尽可能少的匹配,也就是说一旦匹配成功,不在继续尝试,这就是非贪婪模式
解决办法: 在量词后面加上?即可

"12345678".replace(/\d{3,6}?/g, 'X');  //"XX78"
"12345678".match(/\d{3,6}?/g);  //["123", "456"]

分组

( ) 实现分组
demo: 匹配字符串Byron连续出现3次的场景
/Byron{3}/ 错误 {3}重复3次的内容是n,并不是Byron。 那么如何作用到整个单词?
/(Byron){3}/ 分组的功能,能使量词作用于分组

| 可以实现或的作用
比如Byron|Casper
比如Byr(on|Ca)sper

反向引用

"2015-12-25".replace(/-/g, '/'); //"2015/12/25"
"2015-12-25".replace(/(\d{4})-(\d{2})-(\d{2})/g, '$1/$2/$3');  //"2015/12/25"
"2015-12-25".replace(/(\d{4})-(\d{2})-(\d{2})/g, '$3/$2/$1');  //"25/12/2015"

忽略分组

如果不希望捕获某些分组,只需要在分组内加上 ?: 就可以了

"Byron1ok".replace(/(?:Byron).(ok)/g, '$1'); //"ok"

前瞻

正则表达式是从文本从头到尾解析,文本尾部方向,称为前,文本头部方向,称为后.
前瞻就是正则表达式匹配到规则的时候,向前检查是否符合断言。后顾的方向相反。javascript不支持后顾

断言可以是肯定也可以是否定。

名称含义
正向前瞻exp(?=assert)
负向前瞻exp(?!assert)
"a2*3".replace(/\w(?=\d)/g, 'X'); //"X2*3"
"a2*3".replace(/\w(?!\d)/g, 'X'); //"aX*X"

对象属性

gloabl 默认值false
ignoreCase 默认值false
multiline 默认值false
lastIndex 是当前表达式匹配内容的最后一个字符的下一个位置
source 正则表达式的文本字符串

var reg1 = /\w/;
var reg2 = /\w/gim;
reg1.global  //false
reg1.ignoreCase //false
reg1.multiline  //false
reg1.resource // "\w"

reg2.global //true
reg2.ignoreCase  //true
reg2,multiline  //true

reg1.global = true; //不能赋值
reg1.global //false

reg2.test('ab'); //true
reg2.test('ab'); //true
reg2.test('ab'); //false  和lastIndex有关系

while(reg2.test('ab')) {
	console.log(reg2.lastIndex);  // 1 2 没有以后重置为0
}

// 解决这种问题两种方式
(/\w/g).test("a");  // true 内存开销大一些
var reg2 = /\w/; //没有标志g,lastIndex就无效了,永远是0
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值