正则表达式知识点归纳

什么是正则表达式?

正则表达式是由一个字符序列形成的搜索模式。当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。正则表达式可以是一个简单的字符,或一个更复杂的模式。正则表达式可用于所有文本搜索和文本替换的操作。

正则表达式创建

  1. 字面量(直接量)
// 在一对反斜线中写正则表达式内容,如/abc/
// 正则表达式里面不需要加引号 不管是数字型还是字符串型
var pattern=/正则表达式/修饰符;
var pattern=/qwer/igm;
  1. 构造函数
//构造正则表达式的实例,如new RexExp('abc')
//内部传入的参数为字符串/字符串的变量
var reg =new RegExp("正则表达式","修饰符")
var reg =new RegExp("hello","g");

字符的分类

普通字符

  字母、数字、下划线、汉字、没有特殊含义的符号(,;!@等)

  实际上不是特殊字符的字符都是普通字符

特殊字符

  \:将特殊字符转义成普通字符

模式修饰符

  i:ignoreCase,匹配时忽视大小写

  m:multiline,多行匹配

  g:global,全局匹配

  字面量创建正则时,模式修饰符写在一对反斜线后

正则表达式实例方法

  1. exec---->>可用来匹配字符串中符合正则表达式的字符串

如果匹配到,返回值是一个result数组:[匹配的内容,index: 在str中匹配的起始位置,input: 参数字符串,groups: undefined],r如果匹配不到则返回null

例如:

var str = 'hello world hello';
var reg1 = /hello/;
var reg2 = /hello/g;  //g表示全局匹配,也就是会匹配到str中所有满足正则表达式条件的字段
var reg3 = /exe/g;
console.log(reg1.exec(str)); //[ 'hello', index: 0, input: 'hello world hello', groups: undefined ]
console.log(reg2.exec(str)); //[ 'hello', index: 0, input: 'hello world hello', groups: undefined ]
console.log(reg3.exec(str)); // null     //str中并不存在exe字段,所以输出null

// 如果是全局模式的正则验证 还可以使用循环进行输出
var reg = /hello/g;
var str = 'hello world hello hello good';
while(true)
    var result = reg.exec(str);
    if(!result){
        break;
    }
    console.log(result[0],result["index"],reg.lastIndex);  //hello 18 23
}

需要注意的地方就是

1)如果正则表达式中有修饰符"g",这时,在正则表达式的实例reg中会维护lastIndex属性,记录下一次开始的位置,当第二次执行exec的时候,从lastIndex开始检索。
2)如果正则表达式中没有修饰符"g",不会维护lastIndex属性,每次执行从开始位置检索

2.test ---->> 用来测试待检测的字符串中是否有可以匹配到正则表达式的字符串,如果有返回true,否则返回false

例如:

var str = 'hello world';
var reg1 = /world/;
var reg2 = /Regex/;
console.log(reg1.test(str)); //返回true
console.log(reg2.test(str)); //返回false

其实我比较喜欢把字符串str放在test()更好看(直观校对)哈~~~

var reg1 = /world/;
var reg2 = /Regex/;
console.log(reg1.test(hello world)); //返回true
console.log(reg2.test(hello world)); //返回false

//由结果可知
//字符串中是否有可以匹配到正则表达式的字符串world,所以返回true

3.toString/toLocaleString --->> 把正则表达式的内容转化成字面量形式字符串/有本地特色的字符串(JS中没效果)

例如:

var reg1 = /hello/;
console.log(reg1.toString()); //   /hello/    string
console.log(reg1.toLocaleString()); //   /hello/   string

4.valueOf ------>> 返回一个 Number 对象的基本数字值

它的作用是返回正则表达式本身

例如:

var reg1 = /hello/;
console.log(reg1.valueOf());  //    /hello/      返回正则表达式本身

正则表达式实例属性

  1. lastIndex
    在菜鸟教程的解析为astIndex 属性用于规定下次匹配的起始位置,该属性只有设置标志 g 才能使用。

所以,当没设置全局匹配时,该属性值始终为0

设置了全局匹配时,每执行一次exec/test来匹配,latIndex就会移向匹配到的字符串的下一个位置,当指向的位置后没有可以再次匹配的字符串时,下一次执行exec返回null,test执行返回false,然后lastIndex归零,从字符串的开头重新匹配一轮

可以理解成,每次正则查找的起点就是lastIndex

简而言之,全局匹配字符 g 对lastindex起到维护的作用,没有 g ,lastindex就没有作用

例如:

var reg =new RegExp('hello')
var reg1 = /hello/g;
var str = 'hello hello hello';  //字符串最后一个数的后面存在一个空字符'hello hello hello""'

console.log('正则表达式构造函数');
console.log(reg.lastIndex); //0
console.log(reg.exec(str)); //返回第一个hello
console.log(reg.lastIndex); //0


console.log('正则表达式字面量');
console.log(reg1.lastIndex); //0
console.log(reg1.exec(str)); //[ 'hello', index: 0, input: 'hello hello hello', groups: undefined ]  第一个hello
//每执行一次exec/test来匹配,latIndex就会移向匹配到的字符串的下一个位置  所以当前lastIndex正好指向空格
console.log(reg1.lastIndex); //5

console.log(reg1.lastIndex); //5
console.log(reg1.exec(str)); //返回第二个hello   [ 'hello', index: 6, input: 'hello hello hello', groups: undefined ]
//每执行一次exec/test来匹配,latIndex就会移向匹配到的字符串的下一个位置  所以当前lastIndex正好指向空格
console.log(reg1.lastIndex); //11

console.log(reg1.lastIndex); //11
console.log(reg1.exec(str)); //返回第三个hello   [ 'hello', index: 12, input: 'hello hello hello', groups: undefined ]
//每执行一次exec/test来匹配,latIndex就会移向匹配到的字符串的下一个位置  所以当前lastIndex正好指向空格
console.log(reg1.lastIndex); //17    //因为字符串最后一个数的后面存在一个空字符'hello hello hello""'

console.log(reg1.exec(str));  //null

// 当指向的位置后没有可以再次匹配的字符串时,重新开始找
console.log(reg1.lastIndex); //0
console.log(reg1.exec(str));  //返回第一个hello   [ 'hello', index: 0, input: 'hello hello hello', groups: undefined ]

2.ignoreCase、global、multiline------>>判断正则表达式中是否有忽略大小写、全局匹配、多行匹配三个模式修饰符

例如:

var reg1 = /hello/igm;
console.log(reg1.ignoreCase); //true   忽略大小写
console.log(reg1.global); //true  全局匹配
console.log(reg1.multiline);  //true   多行匹配

3.source --->> 返回字面量形式的正则表达式(类似于toString)

例如:

var reg1 = /hello/igm;
console.log(reg1.source);  //hello   返回正则表达式本身

正则表达式语法-元字符

正则表达式中的所有字母和数字都是按照字面含义进行匹配的,Javascript正则表达式语法也支持非字母的字符匹配,这些字符需要通过反斜线\作为前缀进行转义。

  1. 直接量字符

    正则表达式知识点归纳_第1张图片

  2. 字符集合
    一个字符集合,也叫字符组。匹配集合中的任意一个字符。你可以使用连字符‘-’指定一个范围

方括号用于查找某个范围内的字符:

[abc] 查找方括号之间的任何字符

var str = 'abc qwe abd'
var reg1 = /[abc]/;// 只要包含有a 或者 包含有b 或者包含有c 都返回为true
console.log(reg1.test(str)); //true

[0-9] 查找任何从0至9的数字

var str = 'abc qwe abd1'
var reg1 = /[0-9]/igm;
console.log(reg1.test(str)); //true

一个反义或补充字符集,也叫反义字符组。也就是说,它匹配任意不在括号内的字符。你也可以通过使用连字符 '-' 指定一个范围内的字符。

注意^写在[]里面是补充字符集

//反义字符组
//它匹配任意不在括号内的字符。你也可以通过使用连字符 '-' 指定一个范围内的字符。
var str = 'abc qwe abd1,2'
console.log(str);
var reg1 = /[^abc]/igm; //除了abc,可取其他任意字符
console.log(reg1.exec(str)); 
//[ 'q', index: 4, input: 'abc qwe abd1,2', groups: undefined ]
console.log(reg1.test(str)); //true //
  1. 边界符
  • ^ 匹配输入开始。表示匹配行首的文本(以谁开始)。如果多行(multiline)标志被设为 true,该字符也会匹配一个断行(line break)符后的开始处。

    例如:

// 以 ^ 开始
// 必须是以hel开头的字符串才会满足
var reg = /^[hel]/;
console.log(reg.exec(hello world hello Regexp));   // [ 'h', index: 0, input: 'hello world hello Regexp', groups: undefined ]
console.log(reg.test(hello world hello Regexp)); //true
console.log(reg.test('aabcd')); // false
  • $ 匹配输入结尾。表示匹配行尾的文本(以谁结束)。如果多行(multiline)标志被设为 true,该字符也会匹配一个断行(line break)符的前的结尾处。

例如:

//  以 $ 结束
// 必须是以exp结尾的字符串才会满足
var reg1 = /[exp]$/;
console.log(reg1.exec(hello world hello Regexp));
// [
//      'p',
//      index: 23,
//      input: 'hello world hello Regexp',
//      groups: undefined
//    ]
console.log(reg1.test(hello world hello Regexp));  //true
console.log(reg.test('aabcd')); // false
  • 如果 ^和 $ 在一起,表示必须是精确匹配。
// 如果 ^和 $ 在一起,表示必须是精确匹配
var reg2 = /^hello$/;
console.log(reg2.test('hello'));  //true
console.log(reg2.test('helloeeee'));  //false

4.字符集合与"^"和"$"一起使用

// 字符集合与"^"和"$"一起使用

// 三选一 只有是a 或者是 b  或者是c 这三个字母才返回 true
var rg1 = /^[abc]$/;     //单个匹配 
console.log(rg1.test('aa'));//false
console.log(rg1.test('a'));//true
console.log(rg1.test('b'));//true
console.log(rg1.test('c'));//true
console.log(rg1.test('abc'));//false

//26个英文字母任何一个字母返回 true  - 表示的是a 到z 的范围  
var reg = /^[a-z]$/
console.log(reg.test('a'));//true
console.log(reg.test('z'));//true
console.log(reg.test('A'));//false


//字符组合
// 26个英文字母(大写和小写都可以)任何一个字母返回 true
var reg1 = /^[a-zA-Z0-9]$/;

//取反 方括号内部加上 ^ 表示取反,只要包含方括号内的字符,都返回 false 。
var reg2 = /^[^a-zA-Z0-9]$/;
console.log(reg2.test('a'));//false
console.log(reg2.test('B'));//false
console.log(reg2.test(8));//false
console.log(reg2.test('!'));//true
console.log(reg2.test('?'),'其他字符'); //true
console.log(reg2.test(':'),'其他字符'); //true
console.log(reg2.test('='),'其他字符'); //true

\b 匹配一个零宽单词边界(zero-width word boundary),表示一个单词(而非字符)边界,也就是单词和空格之间的位置,或者字符(\w)与字符串开头或者结尾之间的位置。

\B 匹配一个零宽非单词边界(zero-width non-word boundary),与"\b"相反。

例如:

//
var str = 'Hello World Hello JavaScript';
// \b   匹配一个零宽单词边界(zero-width word boundary),表示一个单词(而非字符)边界,
// 也就是单词和空格之间的位置,或者字符(\w)与字符串开头或者结尾之间的位置。
var reg1 = /\bHello\b/g;


// \B  匹配一个零宽非单词边界(zero-width non-word boundary),与"\b"相反
var reg2 = /\BScrip\B/g;

console.log(reg1.exec(str));
// [
//      'Hello',
//      index: 0,
//      input: 'Hello World Hello JavaScript',
//      groups: undefined
//    ]
console.log(reg2.exec(str));
// [
//      'Scrip',
//      index: 22,
//      input: 'Hello World Hello JavaScript',
//      groups: undefined
//    ]

 

你可能感兴趣的