正则(js)

1、正则

正则表达式:正则(regular)表达式(expression)

是对字符串操作的一种逻辑公式,就是用事先定义好的一些特殊字符,及这些特定字符的组合,组成一个‘规则字符串’,这个规则字符串用来表达对字符串的一种过滤逻辑。

1、创建

  • 字面量创建: /检索字符/修饰符;

  • 构造函数创建:new RegExp('检索字符','修饰符');

var re = /a/ig; // a是字符串
var re = new RegExp('a', 'ig'); // a是字符串
// 一般推荐用字面量方式创建,什么时候用构造函数的方式创建?有变量的时候
var a = 'abc';
var re = new RegExp(a, 'ig'); // a是变量

 

2、正则的方法

1、正则下面的方法

  • test     exec

2、字符串下面的方法

  • match   split   replace   search

1、test

  • 格式:正则.test(字符串);

  • 作用:检索字符串中是否包含正则要检索的内容,有则返回true,没有则返回false

var str = 'abcdefg';
var re1 = /c/;
var re2 = /cde/;
var re3 = /cef/;
​
console.log(re1.test(str)); // true
console.log(re2.test(str)); // true
console.log(re3.test(str)); // false

 

2、exec

  • 格式:正则.exec(字符串);

  • 作用:检索到正则表达式规定的内容会返回一个数组,检索不到则返回null

var str = 'hello world';
var re1 = /o/;
var re2 = /O/;
var re3 = /O/i;
​
console.log(re1.exec(str)); // ['o']
console.log(re2.exec(str)); // null  
console.log(re3.exec(str)); // ['o']  

 

3、match

  • 格式:字符串.match(正则);

  • 作用:正则去匹配字符串,如果匹配成功,就返回匹配成功的数组,如果匹配不成功,就返回null,跟exec方法类似

  • 同exec的区别:识别修饰符g,而exec不识别g

var str = 'hello world';
var re1 = /o/;
var re2 = /O/;
var re3 = /O/ig;
​
console.log(str.match(re1)); // [ "o" ]
console.log(str.match(re2)); // null
console.log(str.match(re3)); // [ "o", "o" ]
 

4、split

  • 格式:字符串.split(正则);

  • 作用:按正则匹配的内容拆分成数组

var str = 'hello world';
var re = /\s/;
console.log(str.split(re));  // ['hello', 'world']
// -------------------------------
var str = '2020-10-10 12:12:12';
var re = /\s|-|:/;
console.log(str.split(re)); // [2020,10,10,12,12,12]

 

5、replace

  • 格式:字符串.replace(正则, 新的字符);

  • 作用:替换正则匹配的字符串,返回替换以后的内容,不改原字符

var str = "hello web,hello ui,hello java";
var re1 = /hello/;
var re2 = /hello/g;
​
console.log(str.replace(re1, '你好'));
console.log(str.replace(re2, '你好'));

 

 

6、search

  • 格式:字符串.search(正则);

  • 作用:返回正则匹配到的第一个字符串的位置,没有返回-1 (类似于字符串的indexOf)

var str = 'hello world';
var re1 = /o/;
var re2 = /O/;
​
console.log(str.search(re1)); // 4
console.log(str.search(re2)); // -1

 

3、正则的默认规则

1、区分大小写:添加修饰符 i,即可以不区分

2、只匹配成功一次,就不再匹配了,需要全部匹配,则加修符饰 g

4、转义字符

转义字符:它本来有自己的意思,加上反斜扛,就成了其它的意思了

alert('a\nb'); // n本身就是字符n的意思,加上反斜扛就成了换行
元字符/元符号匹配情况
. 匹配除换行符外的任意字符
[a-z0-9] 匹配括号中的字符集中的任意字符
[^a-z0-9] 匹配任意不在括号中的字符集中的字符
\d 匹配数字
\D 匹配非数字,同0-9相同
\w 匹配字母和数字及_
\W 匹配非字母和数字及_
\s 空格
\S

非空格

元字符/元符号匹配情况
^ 行首匹配
$ 行尾匹配
\A 只有匹配字符串开始处
\b 匹配单词边界,词在[]内时无效
\B 匹配非单词边界
\G 匹配当前搜索的开始位置
\Z 匹配字符串结束处或行尾
\z 只匹配字符串结束处
元字符/元符号匹配情况
x? 匹配0个或1个x
x* 匹配0个或任意多个x
x+ 匹配至少一个x
(xyz)+ 匹配至少一个(xyz)
x{m,n} 匹配最少m个、最多n个x
元字符/元符号匹配情况
this|where|logo 匹配this或where或logo中任意一个
元字符/元符号匹配情况
(string) 用于反向引用的分组
\1或$1 匹配第一个分组中的内容
\2或$2 匹配第二个分组中的内容
\3或$3 匹配第三个分组中的内容
(?!pattern) 非获取匹配,正向否定预查

5、正则中其它概念

1、或

  • 正则里的或者|

2、点

点:代表任意字符

真正的点:扛点

var str = 'abcd';
var re1 = /a.c/; // 任意字符
var re2 = /a.../; // 任意字符
console.log(re1.exec(str));
console.log(re2.exec(str));

 

3、中括号的作用

  • 字符类:一组相同的元素,中括号不论写多少,都只代表一个字符

// 中括号:代表一类字符,中括号不论写多少,都只是一个字符
var str = 'abcde';
var re = /a[abcde]c/; // 可以是中括号中的任意一个字符(中括号只代表一个字符)
console.log(re.test(str)); // true

var re = /[0-9a-zA-Z]/; // 数字0-9 字母a-z 大写字母A-Z
var re = /[a-f]/;

 

  • 中括号中的^号 : 排除

var re = /[^0-9]/; // 排除数字  非数字

 

4、大括号的作用

量词:x{m,n} x最少m个,最多n个

var re = /a{10}/; // a刚好10次
var re = /a{5,10}/; // a最少5次,最多10
var re = /a{0,1}/; // var re = /a?/;  0或1次
var re = /a{0,}/; // var re = /a*/;  0次或者多次
var re = /a{1,}/; // var re = /a+/  一次或者多次

 

5、小括号的作用

分组

// 小括号:分组
var str = '2020-9-8';
var re = /(\d-)+/g;
console.log(str.match(re)); // [ "0-9-" ]

var str = 'ssfds454akfh34d2sklhf233';
var re = /\d+/g;
console.log(str.match(re)); // [ "454", "34", "2", "233" ]

 

6、匹配开始和结束

^行首匹配
$ 行尾匹配

7、正则实例

// 手机号中间四位变量
var str = '18246195158';
var re = /(\d{3})\d{4}(\d{4})/;
var s = str.replace(re, function ($0, $1, $2) {
    // console.log($0, $1, $2);
    return $1 + '****' + $2;
});
console.log(s);

// ---------------------------

var s = str.replace(re, '$1****$2');
console.log(s);

// ------------------------------
// 邮编
var re = /^\d{6}$/;


// 匹配中文
var re = /[\u4e00-\u9fa5]/g; // 有事一00,有酒罚我
var str = '34rew我sdfsdfdsa是你dsf北dsafdsa京sf大dsaf32423243234f爷fds';
console.log(str.match(re).join(''));

// --------------------------
// email
var str = '32423423@qq.com.cn';
var str = 'fds@163.com';
var re = /^\w+@[a-z0-9]+(\.[a-z]+){1,3}$/;

// 网址
var str = 'https://www.baidu.com';
var re = /^[a-zA-Z]+:\/\/[^\s]+$/;

// 身份证号
var re = /^[1-9]\d{14}|[1-9]\d{17}|[1-9]\d{16}x$/;

// 电话号码
var re = /^0\d{2,3}-[1-9]\d{6,7}$/;

 

6、前瞻

  • 前瞻: exp1(?=exp2) 查找后面是exp2的exp1

  • 负前瞻:exp1(?!exp2) 查找后面不是exp2的exp1

// 假如我们想匹配“优就业”中的“就”,而不是其他的“就”字就需要用到前瞻后顾。
var str = '我就是我,来优就业学习';
var re = /就(?=业)/g;
var s = str.replace(re, 'jiu');
console.log(s);

// --------------------------
// 获取文件名  hello  nodata  index
var path1 = 'path/hello.html';
var path2 = 'path/nodata.html';
var path3 = 'path/index.html';

var re = /\w+(?=\.html)/;
console.log(path1.match(re));
console.log(path2.match(re));
console.log(path3.match(re));

// --------------------
// 负前瞻:exp1(?!exp2)     查找后面不是exp2的exp1
var str = 'a,1,b,2,c,3'; // 把字符串改成 a=1,b=2,c=3
var re = /,(?![a-z])/g;
var s = str.replace(re, '=');
console.log(s); // a=1,b=2,c=3

 

7、可视化工具

网址:https://regexper.com

 

posted @ 2020-09-20 22:59  正经的流刺源  阅读(1044)  评论(0编辑  收藏  举报