正则总结六

6.1 正则表达式的四种操作

6.1.1 验证

  • 验证是正则表达式最直接的应用,比如表单验证
  • 在说验证之前,先要说清楚匹配是什么概念
  • 所谓匹配,就是看目标字符串里是否有满足匹配的子串。因此,“匹配”的本质就是“查找”

比如,判断一个字符串中是否有数字

使用search

var regex = /\d/;
var string = "abc123";
console.log( !!~string.search(regex) );
// => true

使用test

var regex = /\d/;
var string = "abc123";
console.log( regex.test(string) );
// => true

使用match

var regex = /\d/;
var string = "abc123";
console.log( !!string.match(regex) );
// => true

使用exec

var regex = /\d/;
var string = "abc123";
console.log( !!regex.exec(string) );
// => true

其中,最常用的是test

6.1.2 切分

  • 匹配上了,我们就可以进行一些操作,比如切分
  • 所谓“切分”,就是把目标字符串,切成一段一段的。在JS中使用的是split
  • 比如,目标字符串是"html,css,javascript",按逗号来切分
var regex = /,/;
var string = "html,css,javascript";
console.log( string.split(regex) );
// => ["html", "css", "javascript"]

又比如,如下的日期格式

2017/06/26
2017.06.26
2017-06-26

可以使用split“切出”年月日

var regex = /\D/;
console.log( "2017/06/26".split(regex) );
console.log( "2017.06.26".split(regex) );
console.log( "2017-06-26".split(regex) );
// => ["2017", "06", "26"]
// => ["2017", "06", "26"]
// => ["2017", "06", "26"]

6.1.3 提取

  • 虽然整体匹配上了,但有时需要提取部分匹配的数据
  • 此时正则通常要使用分组引用(分组捕获)功能,还需要配合使用相关API。

这里,还是以日期为例,提取出年月日。注意下面正则中的括号

match

var regex = /^(\d{4})\D(\d{2})\D(\d{2})$/;
var string = "2017-06-26";
console.log( string.match(regex) );
// =>["2017-06-26", "2017", "06", "26", index: 0, input: "2017-06-26"]

exec

扫描二维码关注公众号,回复: 13558382 查看本文章
var regex = /^(\d{4})\D(\d{2})\D(\d{2})$/;
var string = "2017-06-26";
console.log( regex.exec(string) );
// =>["2017-06-26", "2017", "06", "26", index: 0, input: "2017-06-26"]

test

var regex = /^(\d{4})\D(\d{2})\D(\d{2})$/;
var string = "2017-06-26";
regex.test(string);
console.log( RegExp.$1, RegExp.$2, RegExp.$3 );
// => "2017" "06" "26"

search

var regex = /^(\d{4})\D(\d{2})\D(\d{2})$/;
var string = "2017-06-26";
string.search(regex);
console.log( RegExp.$1, RegExp.$2, RegExp.$3 );
// => "2017" "06" "26"

replace

var regex = /^(\d{4})\D(\d{2})\D(\d{2})$/;
var string = "2017-06-26";
var date = [];
string.replace(regex, function(match, year, month, day) {
    
    
    date.push(year, month, day);
});
console.log(date);
// => ["2017", "06", "26"]

其中,最常用的是match

6.1.4 替换

找,往往不是目的,通常下一步是为了替换。在JS中,使用replace进行替换

比如把日期格式,从yyyy-mm-dd替换成yyyy/mm/dd

var string = "2017-06-26";
var today = new Date( string.replace(/-/g, "/") );
console.log( today );
// => Mon Jun 26 2017 00:00:00 GMT+0800 (中国标准时间)

6.2 相关API注意要点

从上面可以看出用于正则操作的方法,共有6个,字符串实例4个,正则实例2个

String#search

String#split

String#match

String#replace

RegExp#test

RegExp#exec

search和match的参数问题

  • 我们知道字符串实例的那4个方法参数都支持正则和字符串
  • searchmatch,会把字符串转换为正则的
var string = "2017.06.27";

console.log( string.search(".") );
// => 0
//需要修改成下列形式之一
console.log( string.search("\\.") );
console.log( string.search(/\./) );
// => 4
// => 4

console.log( string.match(".") );
// => ["2", index: 0, input: "2017.06.27"]
//需要修改成下列形式之一
console.log( string.match("\\.") );
console.log( string.match(/\./) );
// => [".", index: 4, input: "2017.06.27"]
// => [".", index: 4, input: "2017.06.27"]

console.log( string.split(".") );
// => ["2017", "06", "27"]

console.log( string.replace(".", "/") );
// => "2017/06.27"

match返回结果的格式问题

match返回结果的格式,与正则对象是否有修饰符g有关

var string = "2017.06.27";
var regex1 = /\b(\d+)\b/;
var regex2 = /\b(\d+)\b/g;
console.log( string.match(regex1) );
console.log( string.match(regex2) );
// => ["2017", "2017", index: 0, input: "2017.06.27"]
// => ["2017", "06", "27"]
  • 没有g,返回的是标准匹配格式,即,数组的第一个元素是整体匹配的内容,接下来是分组捕获的内容,然后是整体匹配的第一个下标,最后是输入的目标字符串。
  • 有g,返回的是所有匹配的内容。
  • 当没有匹配时,不管有无g,都返回null

exec比match更强大

当正则没有g时,使用match返回的信息比较多。但是有g后,就没有关键的信息index

  • exec方法就能解决这个问题,它能接着上一次匹配后继续匹配
var string = "2017.06.27";
var regex2 = /\b(\d+)\b/g;
console.log( regex2.exec(string) );
console.log( regex2.lastIndex);
console.log( regex2.exec(string) );
console.log( regex2.lastIndex);
console.log( regex2.exec(string) );
console.log( regex2.lastIndex);
console.log( regex2.exec(string) );
console.log( regex2.lastIndex);
// => ["2017", "2017", index: 0, input: "2017.06.27"]
// => 4
// => ["06", "06", index: 5, input: "2017.06.27"]
// => 7
// => ["27", "27", index: 8, input: "2017.06.27"]
// => 10
// => null
// => 0

test整体匹配时需要使用^和$

这个相对容易理解,因为test是看目标字符串中是否有子串匹配正则,即有部分匹配即可

  • 如果,要整体匹配,正则前后需要添加开头和结尾
console.log( /123/.test("a123b") );
// => true
console.log( /^123$/.test("a123b") );
// => false
console.log( /^123$/.test("123") );
// => true

split相关注意事项

  • split方法看起来不起眼,但要注意的地方有两个的

第一,它可以有第二个参数,表示结果数组的最大长度

var string = "html,css,javascript";
console.log( string.split(/,/, 2) );
// =>["html", "css"]

第二,正则使用分组时,结果数组中是包含分隔符的

var string = "html,css,javascript";
console.log( string.split(/(,)/) );
// =>["html", ",", "css", ",", "javascript"]

replace是很强大的

总体来说replace有两种使用形式,这是因为它的第二个参数,可以是字符串,也可以是函数

当第二个参数是字符串时,如下的字符有特殊的含义

  • $1,$2,...,$99 匹配第1~99个分组里捕获的文本
  • $& 匹配到的子串文本
  • `$`` 匹配到的子串的左边文本
  • $' 匹配到的子串的右边文本
  • $$ 美元符号

例如,把"2,3,5",变成"5=2+3":

var result = "2,3,5".replace(/(\d+),(\d+),(\d+)/, "$3=$1+$2");
console.log(result);
// => "5=2+3"

当第二个参数是函数时,我们需要注意该回调函数的参数具体是什么

"1234 2345 3456".replace(/(\d)\d{2}(\d)/g, function(match, $1, $2, index, input) {
    
    
    console.log([match, $1, $2, index, input]);
});
// => ["1234", "1", "4", 0, "1234 2345 3456"]
// => ["2345", "2", "5", 5, "1234 2345 3456"]
// => ["3456", "3", "6", 10, "1234 2345 3456"]

此时我们可以看到replace拿到的信息,并不比exec

修饰符

  • g 全局匹配,即找到所有匹配的,单词是global
  • i 忽略字母大小写,单词ingoreCase
  • m 多行匹配,只影响^和$,二者变成行的概念,即行开头和行结尾。单词是multiline

猜你喜欢

转载自blog.csdn.net/qq_52151772/article/details/115511629