正则表达式

正则表达式

在线工具http://regexper.com

什么是正则表达式

  • Regular Expression 使用单个字符串来描述、匹配一系列符合某个句化规则的字符串
  • 简单的说就是按照某种规则去匹配符合条件的字符串
通配符
  • . 任意字符
  • * 任意个
  • ? 零个或则一个
  • + 一次或多次
  • \b 单词边界
  • [] 表示或
  • () 表示分组
  • ^ 表示开头
  • $ 表示结尾
  • g 全文搜索匹配
REGEXP
字面量
 var str = 'This is a dog He is a boy',
 new_str = str.replace(/\bis\b/g,'IS');
 alert(str+">>>>"+new_str);
构造函数

new RegExp(pattern, attributes);
参数 pattern 是一个字符串,指定了正则表达式的模式或其他正则表达式。
参数 attributes 是一个可选的字符串,包含属性 “g”、”i” 和 “m”,分别用于指定全局匹配、区分大小写的匹配和多行匹配。ECMAScript 标准化之前,不支持 m 属性。如果 pattern 是正则表达式,而不是字符串,则必须省略该参数。
- g :global 全文搜索,不添加,搜索到第一个匹配停止
- i :ignore case 忽略大小写,默认大小写敏感
- m :multiple lines多行搜索

  var Reg = new RegExp('\\bis\\b','g');
  var str = 'This is a dog He is a boy',
  new_str = str.replace(Reg,'IS');
  alert(str+">>>>"+new_str);
元字符
  • 原义文本字符 abc 123
  • 元字符 正则表达式中有特殊含义的非字母字符 * + ? $ ^ . | \ () {} []
字符类

用[]构建一个简单的类
类是指符合某些特定性的对象,一个泛指,而不是特指某个字符,表达式[abc]把字符a或b或c归为一类,表达式可以匹配这类的字符

'a1b2c3d4'.replace(/[abc]/g,'X')
"X1X2X3d4"
字符类取反

使用元字符^创建反向类/负向类
反向类的意思是不属于某类的内容
表达式[^abc]表示不是字符a或b或c的内容

'a1b2c3d4'.replace(/[^abc]/g,'X')
"aXbXcXXX"
范围类

[a-z] 从a到z的所有小写字母

'a1b2c3d4e5'.replace(/[a-z]/g,'Q')
"Q1Q2Q3Q4Q5"

[a-zA-Z] 从a到Z的所有大小写字母

'a1b2c3d4e5DGDGDGFD'.replace(/[a-z]/g,'Q')
"Q1Q2Q3Q4Q5DGDGDGFD"

注意如果本身就像匹配- [0-9-]

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

'2016-04-09'.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 == [a-zA-Z_0-9] 单词字符(字母数字下划线)
\W == [^a-zA-Z_0-9] 非单词字符

边界

^ 以XXX开始
$ 以XXX结束
\b 单词边界
\B 非单词边界

'@123@456@'.replace(/\@./g,'X')
"X23X56@"
'@123@456@'.replace(/^\@./g,'X')
"X23@456@"

'@123@456@'.replace(/.\@/g,'X')
"@12X45X"
'@123@456@'.replace(/.\@$/g,'X')
"@123@45X"

'This is a dog He is a boy'.replace(/\bis\b/g,'IS');
"This IS a dog He IS a boy"
'This is a dog He is a boy'.replace(/\Bis/g,'IS');
"ThIS is a dog He is a boy"
量词

? 出现零次或者一次(最多出现一次)
+ 出现一次或者多次(至少一次)
* 出现零次或者多次(任意次)
{n} 出现n次
{n,m} 出现n到m次
{n,} 至少出现n次

贪婪模式
'12345678'.replace(/\d{3,6}/g,'X')
"X78"
非贪婪模式
'12345678'.replace(/\d{3,6}?/g,'X')
"XX78"
分组

()可以达到分组的功能
(shunzizhan){3}

'a1b2c3de5'.replace(/([a-z]\d){3}/g,'X')
"Xde5"

使用|达到或的效果

'shunzizhan'.replace(/shun|zizhan/g,'X')
"XX"

'shunzhanshzizhan'.replace(/sh(un|zi)zhan/g,'X')
"XX"
反向引用
'2016-09-18'.replace(/(\d{4})-(\d{2})-(\d{2})/g,'$2/$3/$1')
"09/18/2016"
忽略分组

不希望捕获某些分组,只需要在分组内加上?:

/(?:shunzi).(zhan)/g
前瞻

正则表达式从文本头部向尾部开始解析,文本尾部方向,称为“前”
前瞻就是在正则表达式匹配到规则的时候,向前检查是否符合断言,后顾/前瞻方向相反
JavaScript不支持后顾
符合和不符合特定断言称为肯定/正向匹配和否定/负向匹配

正向前瞻 exp(?=assert)
负向前瞻 exp(?!assert)

'a2*3'.replace(/\w(?=\d)/g,'X')
"X2*3"

'a2*34v8'.replace(/\w(?=\d)/g,'X')
"X2*X4X8"
'a2*34v8'.replace(/\w(?!\d)/g,'X')
"aX*3XvX"
正则表达式的方法

test lastIndex 作怪

var reg = /\w/g;
undefined
reg.test('a')
true
reg.test('a')
false
reg.test('a')
true
reg.test('a')
false

exec
使用正则表达式模式对字符串执行搜索,并将更新全局RegExp对象的属性以反映匹配结果
如果没有匹配的文本则返回null,否则返回一个结果数组
- index 声明匹配文本的第一个字符的位置
- input 存放被检索的字符串string

字符串对象方法

用于检测字符串中指定的子字符串,或检测与正则表达式相匹配的子字符串
方法返回第一个匹配结果index,查找不到返回-1
不执行全局匹配,忽略标志g,并且总是从字符串的开始进行检索

'a1b2c3d4'.search(1)
1
'a1b2c3d4'.search('1')
1
'a1b2c3d4'.search(/1/)
1
'a1b2c3d4'.search(/1/g)
1
match

将检索字符串,以找到一个或者多个与regexp匹配的文本
regexp是否具有标志g对结果影响很大

非全局
没有g,则只能在字符串中执行一次匹配
如果没有找到任何匹配的文本,将返回null
否则他将返回一个数组,其中存放与它找到的匹配有关的信息
返回数组的第一个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本
返回的数组,还包含2个对象属性
- index 声明匹配文本的起始字符在字符串中的位置
- input 声明对stringObject的引用

全局
具有g标志,执行全局检索,找到字符串中所有匹配子字符串
如果没有找到任何匹配的文本,将返回null
如果找到了一个或者多个匹配子串,则返回一个数组
数组中存放的是字符串中所有的匹配子串,而且没有index input属性

split
'a1b2c3d'.split(/\d/)
["a", "b", "c", "d"]
replace

String.prototype.replace(str,replaceStr)
String.prototype.replace(reg,replaceStr)
String.prototype.replace(reg,function)
**function**4个参数
1.匹配字符串
2.正则表达式分组内容,没有分组则没有该参数
3.匹配项在字符串中的index
4.原字符串

'a1b1c1'.replace('1','2')
"a2b1c1"
'a1b1c1'.replace(/1/g,'2')
"a2b2c2"

'a1b2c3d4' => 'a2b3c4d5'

'a1b2c3d4'.replace(/\d/g,function(childstr,index,str){
  return parseInt(childstr)+1;
})

'a1b2c3d4e5'.replace(/(\d)(\w)(\d)/g,function(match,group1,group2,group3,index,origin){
  console.log(match);
  return group1 + group3;
})
VM651:3 1b2
VM651:3 3d4
"a12c34e5"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值