美文网首页
4、正则的拓展

4、正则的拓展

作者: Daeeman | 来源:发表于2020-08-19 01:09 被阅读0次

4 正则的拓展

#4.1 介绍

在ES5中有两种情况。

  • 参数是字符串,则第二个参数为正则表达式的修饰符。
let a = new RegExp('abc', 'i');
// 等价于
let a = /abx/i;

  • 参数是正则表达式,返回一个原表达式的拷贝,且不能有第二个参数,否则报错。
let a = new RegExp(/abc/i);
//等价于
let a = /abx/i;

let a = new RegExp(/abc/, 'i');
//  Uncaught TypeError

ES6中使用:
第一个参数是正则对象,第二个是指定修饰符,如果第一个参数已经有修饰符,则会被第二个参数覆盖。

new RegExp(/abc/ig, 'i');

#4.2 字符串的正则方法

常用的四种方法:match()replace()search()split()

#4.3 u修饰符

添加u修饰符,是为了处理大于uFFFF的Unicode字符,即正确处理四个字节的UTF-16编码。

/^\uD83D/u.test('\uD83D\uDC2A'); // false
/^\uD83D/.test('\uD83D\uDC2A');  // true

由于ES5之前不支持四个字节UTF-16编码,会识别为两个字符,导致第二行输出true,加入u修饰符后ES6就会识别为一个字符,所以输出false

注意:
加上u修饰符后,会改变下面正则表达式的行为:

  • (1)点字符 点字符(.)在正则中表示除了换行符以外的任意单个字符。对于码点大于0xFFFF的Unicode字符,点字符不能识别,必须加上u修饰符。
var a = "𠮷";
/^.$/.test(a);  // false
/^.$/u.test(a); // true

  • (2)Unicode字符表示法 使用ES6新增的大括号表示Unicode字符时,必须在表达式添加u修饰符,才能识别大括号。
/\u{61}/.test('a');      // false
/\u{61}/u.test('a');     // true
/\u{20BB7}/u.test('𠮷'); // true

  • (3)量词 使用u修饰符后,所有量词都会正确识别码点大于0xFFFF的 Unicode 字符。
/a{2}/.test('aa');    // true
/a{2}/u.test('aa');   // true
/𠮷{2}/.test('𠮷𠮷');  // false
/𠮷{2}/u.test('𠮷𠮷'); // true

  • (4)i修饰符 不加u修饰符,就无法识别非规范的K字符。
/[a-z]/i.test('\u212A') // false
/[a-z]/iu.test('\u212A') // true

检查是否设置u修饰符: 使用unicode属性。

const a = /hello/;
const b = /hello/u;

a.unicode // false
b.unicode // true

#4.4 y修饰符

y修饰符与g修饰符类似,也是全局匹配,后一次匹配都是从上一次匹配成功的下一个位置开始。区别在于,g修饰符只要剩余位置中存在匹配即可,而y修饰符是必须从剩余第一个开始。

var s = 'aaa_aa_a';
var r1 = /a+/g;
var r2 = /a+/y;

r1.exec(s) // ["aaa"]
r2.exec(s) // ["aaa"]

r1.exec(s) // ["aa"]  剩余 '_aa_a'
r2.exec(s) // null

lastIndex属性: 指定匹配的开始位置:

const a = /a/y;
a.lastIndex = 2;  // 从2号位置开始匹配
a.exec('wahaha'); // null
a.lastIndex = 3;  // 从3号位置开始匹配
let c = a.exec('wahaha');
c.index;          // 3
a.lastIndex;      // 4

返回多个匹配
一个y修饰符对match方法只能返回第一个匹配,与g修饰符搭配能返回所有匹配。

'a1a2a3'.match(/a\d/y);  // ["a1"]
'a1a2a3'.match(/a\d/gy); // ["a1", "a2", "a3"]

检查是否使用y修饰符
使用sticky属性检查。

const a = /hello\d/y;
a.sticky;     // true

#4.5 flags属性

flags属性返回所有正则表达式的修饰符。

/abc/ig.flags;  // 'gi'

相关文章

  • 4、正则的拓展

    4 正则的拓展 #4.1 介绍 在ES5中有两种情况。 参数是字符串,则第二个参数为正则表达式的修饰符。 参数是正...

  • 正则的拓展

    新增y修饰符 y修饰符跟g有点类似,但是仅仅是类似,y跟g不同的是,g是匹配到一个后,不管匹配到的字符后面紧跟着的...

  • 正则表达式

    基础正则表达式 拓展正则表达式 贪婪与懒惰

  • es6

    3.1 const 3.2 解构赋值 3.3 正则拓展 3.4 字符串拓展 ES7提案 3.6 数值拓展 3.7 ...

  • shell编程之正则表达式

    正则表达式在程序语言中很常见 有利于其他语言中正则表达式的学习 1.正则表达式 ?和()是拓展正则 若是以".$"...

  • 正则表达式 - 2017 - 完结篇

    ** 题记:接上回,我们说到了关于正则表达式的基本的语法,这次我们就来继续拓展正则表达式的内容,包括了正则表达式中...

  • 前端表单验证常用的15个JS正则表达式

    1 用户名正则 2 密码强度正则 3 整数正则 4 数字正则 6 手机号码正则 7 身份证号正则 9 IPv4地址...

  • iOS拓展-正则运算

    1. 正则运算意义 regular expression 描述了一种字符串匹配的模式,可以用来检查一个串是否含有某...

  • Markdown-富文本转换(2)

    上一节编写关于编写使用正则正则转换标题、图片链接,网页链接、代码块的例子,接下继续编写其拓展。Markdown-富...

  • 从贝叶斯到深度学习及各自优缺点

    正则化算法(Regularization Algorithms) 回归的拓展,会基于模型复杂性对其进行惩罚,它喜欢...

网友评论

      本文标题:4、正则的拓展

      本文链接:https://www.haomeiwen.com/subject/qqujdktx.html