正则表达式

2016-09-17  本文已影响39人  strong9527

javascript 中的正则表达式。

在使用正则表达式的时候,总是要重新看一遍,感觉基础不牢,今天再看了慕课网正则表达式课程新出的课程后将全部的知识点做了一个总结,今后的正则表达式不用担心了。

1 定义正则表达式。

1 字面量
2 对象定义。


var reg = /\bis\b/g ; //字面量形式定义

var reg = new RegExp('\\bis\\b','g');  //双反斜线是因为在javascript中反斜线本身就是保留字符。需要转义

2修饰符


var str = "this is my first name is";
console.log(str.replace(/\bis\b/,"IS"));  //this IS my first name is

console.log(str.replace(/\bis\b/g,"IS"));  //this IS my first name IS


var str = "this IS my first name is";
console.log(str.replace(/\bis\b/g,"as"));  //this IS my first name as

console.log(str.replace(/\bis\b/gi,"as"));  //this as my first name as

元字符。

正则表达式由两种基本字符类型组成

元字符是在正则表示中有特殊含义的非字母字符。

以下是一些例子

字符 含义
\t 水平制表符
\v 垂直制表符
\n 换行符
\r 回车符
\o 回车符
\f 换页符
\cX 与X对应的控制字符(Ctrl+X)

字符类


'a2b2c3d4'.replace(/[abc]/g,'X'); // "X1X2X3D4"


字符类取反

范围类


'a1b2d3x4z9'.replace(/[a-z]/g,'Q'); 
// "Q1Q2Q3Q4Q9"

预定义类及边界

字符 等价类 含义
. [^\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] 非单词字符

边界

字符 含义
^ 以XXXX开始
$ 以XXX结束
\b 单词边界
\B 非单词边界

'This is a boy'.replace(/is/g,'0') //Th0 0 a boy
'This is a boy'.replace(/\bis\b/g,'0') //This 0 a boy
'This is a boy'.replace(/\Bis\b/g,'0') //Th0 is a boy

var str = "@123\n@456\n@789";
str.replace(/^@\d/g,'X'); 
// "X23
@456
@789
"

str.replace(/^@\d/gm,'X'); 
// "X23
X56
X89
"

量词

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

贪婪模式 和 非贪婪模式


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

分组

使用()可以达到分组的功能,是量词作用于分组。
(Byron){3}

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

使用 | 可以达到或的效果。


'ByronCaspter'.replace(/Byron|Casper/g,'X') //"XX"
'ByronsperByrCasper'.replace(/Byr(on|Ca)sper/g,'X') //"XX"
''

反向引用


'2016-11-25'.replace(/(\d{4})-(\d{2})-(\d{2})/g,'$2/$3/$1')   
//   11/25/2016

忽略分组

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

(?:Byron).(ok)

前瞻

前瞻

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

'a2*34vv'.replace(/\w(?=\d)/g,'X')
// "X2*X4vv"
'a2*34vv'.replace(/\w(?!\d)/g,'X')
// "aX*3XXX"

正则对象属性(javascript)

test和exec方法

RegExp.prototype.test(str);


var reg2 = /\w/g;
while(reg2,test('ab')){
    console.log(reg2.lastIndex);
}

//1 2

RegExp.prototype.exec(str)

非全局调用

字符串对象方法

String.prototype.search(reg)

String.prototype.match(reg)

非全局调用

ps:此方法和正则表达式的exec方法基本一样。

全局调用


var reg4 = /\d(\w)\d/g;
var ts = '$1a2b3c4d5e'
ret = ts.match(reg4);
console.log(ret);  //['1a2','3c4']
console.log(re.index+'\t'+reg4.lastIndex);//["undefined 0"]

String.prototype.split(reg);


'a,b,c,d'.split(','); //['a','b','c','d']
'a1b2c3d4e'.split(/\d/g) //['a','b','c','d','e'];


String.prototype.replace()


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

function参数含义

function会在每次匹配替换的时候调用,有四个参数

  1. 匹配字符串
  2. 正则表达式分组内容,没有分组则没有该参数。
  3. 匹配项在字符串中的index
  4. 源字符串。

'a1b2c3d4e5'.replace(/\d/g,function(match,index,origin){
    console.log(index);
    return parseInt(match) + 1;
})
 // 结果为"a2b3c4d5e6"


'a1b2c3d4e5'.replace(/(\d)(\w)(\d)/g,function(match,group1,group2,group3,index,origin){
        console.log(match);
        return group1 + group3;
})
    //  结果为:"a12c34e5"
  
上一篇下一篇

猜你喜欢

热点阅读