正则表达式笔记

2017-10-08  本文已影响12人  一刀一个小黄鱼

正则表达式

正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表通常被用来检索、替换那些符合某个模式(规则)的文本。正则并不是js所独有的,他是独立与任何语言之外的,很多的编程语言都支持使用正则规则对字符串进行一些复杂的操作。

正则在js中是以对象的形式存在的,和日期对象,数组对象类似

创建正则对象的方式

  1. 传统: new RegExp()
  2. 简写: //
var re1 = new RegExp('a'); //参数接收字符串,字符串:正则规则的内容
console.log(re1); /a/

var re2 = /a/;
console.log(re2); /a/

var re3 = /\d/;
console.log(re3); /\d/

*//如果使用传统的方式来创建一个正则对象,那么字符串会被默认先进行解析,然后把解析后的字符串作为参数传给正则对象
var re4 = new RegExp('\d')
console.log(re4); /d/
*//首先\d会被字符串解析成字符d,然后在把解析后的d作为参数;

var re5 = new RegExp('\\d');
console.log(re5); /\d/

var usename = 'zzaall';
*// 如果我们通过简写的形式,那么 // 中的字符是不会被js作为特殊数据解析的,比如变量,如果我们的正则中有通过变量来表示的内容,那么简写的方式就不适合了
var re6 = /usename/;
console.log(re6); /usename/

var re7 = new RegExp(username)
console.log(re7); /zzaall/
正则.test(字符串)

检测参数字符串中是否包含有正则对象所匹配的内容,如果有返回true,如果没有就返回false

console.log(/\d/.test('abc1degfg')) //true

\d: 一个数字


字符串.search(字符串/正则)

查找参数的内容在前面字符串中首次出现的位置,如果没有返回-1.和indexOf很类似,但是他和indexOf有一个最大的区别是:indexOf参数只支持字符串,search还可以支持正则

console.log('abcde'.search('a')); 0
console.log('abcde'.search('b')); 1 

console.log('abcde'.search(/a/)); 0
console.log('a2bcde'.search(/\d/)); 1

console.log('bacds'.search(/A/i)); 1
console.log('bacds'.search( new RegExp('A', 'i') )); 1

i: ignore 忽略 大小写

修饰符: 对正则表达式内容的强调与说明


字符串.match(正则)

在前面的字符串中查找和参数匹配的内容,并保存到一个数组中返回

var str = 'j234hj2g42jh4j2k1';
console.log( str.match(/\d/) ); // 2 一个数组,保存第一个数字出现
console.log( str.match(/\d/g) );// 2,3,4,2,4,2,4,2,1所有数字的数组

模式:

var str = 'j234hj2g42jh4j2k1';
console.log( str.match(/\d+/g) ); //234,2,42,4,2,1 

+: 表示+的前一个规则最少匹配一次,最多不限,量词

模式:贪婪:当一组结果中的内容有多个满足的时候,正则会选择最大化的结果作为最终结果


字符串.replace(要查找的内容, 要替换的内容)

在前面的字符串中查找第一个参数指定的内容,并用第二个参数的内容进行替换

console.log('asdasda'.replace('a','*')); //*sdasda

*/简单的字符串替换,只会替换一次,如果我们需要进行一些更为复杂的查找和替换,那么就需要使用正则来进行
console.log( 'asdasda'.replace(/a/gi, '*') ); //*sd*sd

replace

敏感词替换

//我们可以根据当前这次匹配的内容长度来动态的返回不同个数的*
var str = '西红柿是红色的';
var newStr = str.replace(/西红柿|红色/g,function(a){;
console.log(a); //西红柿 红色

var s = '';
for(var i = 0;i < a.lenfth;i++){
    s += '*'
}
return s;
});
console.log(newStr);
//***是**的
子项
var d1 = '2017-7-17';

function formatDate(str){
  return str.replace(/(\d+)\D+(\d+)\D+(\d+)/,function($0,$1,$2,$3){
    // 第一个参数($0):当前整个正则所匹配的内容,后面的参数是每个()里的内容
    console.log($0); //2017-7-17
    console.log($1); //2017
    console.log($2); //7
    console.log($3); //17
    return $1 + '年' + $2 + '月' + $3 + '日';
  })
}
console.log(formatDate(d1));

\D: 一个非数字

(): 子项; 范围(提权),会在结果中保留(提供)子项当前匹配的内容

从左至右,从外至里 也可以 根据 ( 出现的顺序来

范围选择

    var str = 'a1ba2ba3baaba4b';

    //a开头b结尾中间是数字 (a数字b)
    console.log(str.replace(/a\db/g, '*'));   ***aab*

    //a开头b结尾中间是1或2或3
    console.log(str.replace(/a(1|2|3)b/g, '*'));  ***aaba4b

    // [] 中的值是被选值,匹配其中的一个
    console.log(str.replace(/a[123]b/g, '*')); ***aaba4b

    console.log(str.replace(/a[123456789]b/g, '*')); ***aab*
    console.log(str.replace(/a[1-9]b/g, '*')); ***aab*
    console.log(str.replace(/a[a-z]b/g, '*')); a1ba2ba3b*a4b
    console.log(str.replace(/a[A-Z]b/g, '*')); a1ba2ba3baaba4b
    console.log(str.replace(/a[a-zA-Z]b/g, '*')); a1ba2ba3b*a4b

    // 匹配的是1-5或7
    console.log(str.replace(/a[1-57]b/g, '*')); ***aab*

    //问题:匹配1-57
    /[1-9]|[1-4]\d|5[0-7]/

反向选择 ^
var str = 'a1ba2ba3baaba4ba5ba6ba7b';
// ^ 在 [] 中使用,表示反向选择的意思,只能在 [] 的开始 ,除了1 2的
console.log(str.replace(/a[^12]b/g, '*'));  a1ba2b******
起始符和结束符

在正则中

^ : 字符串的起始; $ : 字符串的结尾

量词

检测qq号
var qq = '200824584'
console.log(/^[1-9]\d{4,11}$/.test(qq));  true
//第一位是1-9之间的数,后面数字在4到11位之间
常用正则符号
   \d : 一个数字
   \D : 一个非数字
   \w : 一个字符(字母数字下划线)
   \W : 一个非字符(字母数字下划线)
   \s : 一个空格
   \S : 一个非空格
   \b : 一个边界符,如果一个字母数字下划线的左侧或右侧不在是一个字母数字下划线,那么这里就会有一个符号:边界符
   \B : 一个非边界符
   
   . : 任意字符,除了换行符

重复子项
{n} : {n}表示的是一个数字 \1 \2 \3
//重复第n个子项匹配的内容
/(a)b\1/      // \1必须和第一个子项的内容是一致的
/(\d)a\1/    // \1位置上的内容必须和第一个子项的内容保持一致

var str = 'aaaaaabbbbbbjjjjjtttttttttttiiiidddd';
    var n = 0;
    var s = '';
    str.replace(/(\w)\1+/g, function($0, $1) {
        if ($0.length > n) {
            n = $0.length;
            s = $1;
        }
    });
    console.log('出现次数最多的是' + s + ',一共出现了' + n + '次');
    //出现次数最多的是t,一共出现了11次

上一篇 下一篇

猜你喜欢

热点阅读