JavaScript-正则表达式

正则表达式(RegExp)

创建

var reg = /abc/igm;  //字面量定义规则
var str = "abcd";
reg.test(str);  // true   //正则表达式的方法 , 参数为字符串 , 如果符合则返回true
str.match(reg);  //["abc"]  // 字符串的方法,参数为正则表达式 , 返回找到的字符串
var reg = new RegExp("abc" , "igm") // 构造函数定义规则

i 忽略大小写

g 全局匹配

m 多行匹配

var reg = /^a/gm;  // ^a 以a开头  g 全局查找  m 换行匹配
var str = "abc\na";  // `\n`表示换行 ,
str.match(reg); //["a", "a"]  //有m则返回两个a , 去掉则返回一个a

^以什么打头 如果放到 []里面则表示非

var reg = /[^a]/; //非a 查找不是a的单个字符
var str = /abc/;
str.match(reg); // ["b"]   如果加上 g 则返回["b" , "c"]

()优先计算 子表达式 会把括号中匹配的信息也返回

var reg = /(abc|bcd)/;  //匹配abc或者bcd

$ 以什么结尾

表达式 和 元字符

var reg = /[能取到的范围]/; 
\w ===[0-9A-z_] 
\W ===\w
\s //空白字符 空格 \n换行符  \f换页符  \r回车符  \t制表符 \v垂直制表符
\S //非空白字符  
\d  === [0-9]
\D  //非数字
\b  //单词边界
\B  //非单词边界
//存在字符\w和\W相邻,那么这两个字符之间就有单词边界 , 包括字符串首尾
    var str6 = "abc_d,123中文_d3=efg汉字a";
    var reg6 = /[\d\D]\b/g;
    console.log(str6.match(reg6));  //["d", ",", "3", "文", "3", "=", "g", "字", "a"]  // 匹配的是 右边存在单词边界的字符
 .  === [^\r\n]   //非回车换行符的任意字符

量词

+ 一次以上 {1,}

* 任意次 {0,}

? 0 个 或 1个 {0,1}

默认贪婪匹配 量词后边 用 ?修饰表示非贪婪

方法

reg.exec();

var reg = /ab/g;  // 不加 g lastIndex不会变 , 每次匹配的都是第一个ab
var str = "abababab";
console.log(reg.exec(str)); //[ab] //第一个ab  reg.lastIndex 变为2
console.log(reg.exec(str)); //[ab] //从游标为2的地方匹配第二个ab   reg.lastIndex 变为4

str.split(reg) – 按正则表达式拆分字符串

str.replace

str.replace("a",  "b");  //把字符串中找到的第一个 a 替换成 b
var reg = /a/g;
str.replace(reg , "b");  //这样可以实现把所有的 a 替换成 b 如果把 g 去掉 也只能替换第一个 a

str.toUpperCase() //把字符串 str中的字母全变成大写

str.toLowerCase() //字符串字母变小写

正向预查 或者 正向断言

var str = "abaaaa";
var reg = /a(?=b)/g;  // (?=b)不参与选择 , 只参与限定 限定 a 的后边要跟着b 
var reg = /a(?!b)/g;  // (?=b)不参与选择 , 只参与限定 限定 a 的后边不是 b 
str.match(reg);// ["a"]

练习题

检验字符串首尾是否含有数字

var reg = /^\d | \d$/;

匹配四个重复值

var reg = /(\w)\1\1\1/g;  // \1 引用第一个表达式中匹配的值  \2 就是第二个 依次类推

aabb 这种形式的字符串反过来变成 bbaa

var str = "aabb";
var reg  = /(\w)\1(\w)\2/g;
str.replace(reg , "$2$2$1$1") //这里如果就是要替换成 $ 的话 要写 $$ ,类似于转义

//另外的方法
var reg = /(\w)\1(\w)\2/g;
str.replace(reg, function ($ , $1 , $2){ //三个参数一次接收 整个表达式返回结果 , 第一个子表达式结果 , 第二个子表达式结果
    return $2 + $2 + $1 + $1
});

把 // the-first-name 变成小驼峰命名式 // theFirstName

var str = "the-first-name";
var reg = /-(\w)/g;
str.replace(reg, function ($ , $1){
    return $1.toUpperCase();
})

字符串去重

var str = "aaaabbbccc";
var reg = /(\w)\1*/g;
str.replace(reg, "$1");

把 1000000 变成 1.000.000

var str = "1000000"
var reg = /(?=(\B)(\d{3})+$)/g  //匹配后边跟的是一个非单词边界和3的倍数个数字的空白字符
str.replace(reg, ".");

   转载规则


《JavaScript-正则表达式》 张磊 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
JavaScript-预编译 JavaScript-预编译
预编译前奏 imply globle 暗示全局变量 : 未声明直接赋值的的变量归window所有 一切声明的全局变量 , 全是window的属性. window就是全局的域 var a = 123; //window { //
2018-02-22
下一篇 
JS定时器 JS定时器
定时器 都是全局对象window上的方法 , 内部函数this指向window 注意: setInterval("console.log('a');", 1000);//每隔1000毫秒会打印一次字符串a 设置循环定时器 setInte
2018-02-13
  目录