VR全景图片 package JS authentication text ios5 chartjs android项目实例 hadoop特点 linux自动获取ip spark大数据处理技术 hadoop组件 js数组截取前5个 汇编语言clr java 注解 python安装mysql python3下载安装 python图形界面开发 python中的map函数 java基础 java编程入门 java最新框架 java的基本数据类型 java定义变量 java中collection linux简介 怎么装linux系统 php语言入门 魔兽世界字体包 groupby 手机知识 dnf传说装备 steam怎么卸载 视频加文字用什么软件 机械键盘个别键位失灵 网卡驱动安装包 操作系统安装 fastcgi firefox绿色版 苹果手机常去地点
当前位置: 首页 > 学习教程  > 编程语言

regexp:正则表达式

2020/12/28 19:18:25 文章标签:

正则表达式: [abc] 查找方括号之间的任何字符。 [^abc] 查找任何不在方括号之间的字符。 [0-9] 查找任何从 0 至 9 的数字。 [a-z] 查找任何从小写 a 到小写 z 的字符。 [A-Z] 查找任何从大写 A 到大写 Z 的字符。 [A-z] 查找任何从大写 A 到小写 z 的字符。 [adgk]…

正则表达式:
[abc] 查找方括号之间的任何字符。
[^abc] 查找任何不在方括号之间的字符。
[0-9] 查找任何从 0 至 9 的数字。
[a-z] 查找任何从小写 a 到小写 z 的字符。
[A-Z] 查找任何从大写 A 到大写 Z 的字符。
[A-z] 查找任何从大写 A 到小写 z 的字符。
[adgk] 查找给定集合内的任何字符。
[^adgk] 查找给定集合外的任何字符。
(red|blue|green) 查找任何指定的选项。

直接量语法:
/[^xyz]/

正则表达式即描述字符串规则的表达式
https://blog.csdn.net/qq_41261490/article/details/82966077
/pattern/attrs /规则/属性
new RegExp(pattern,attrs)
1.regexObj.test(str)方法:测试正则表达式与指定字符串是否匹配
PS:test()方法只需要待测试字符串中包含了要测试的字符串就是ture
2.锚点:匹配一个位置
^:起始位置
$:结尾位置
\b:单词边界
3.字符类:匹配一类字符中的一个
[abc]:a或b或c
[0-9]:一个数字 [^0-9]:非数字的一个字符
[a-z]:一个字母
.:任一字符(换行符除外)

4.元字符:具有特殊意义的字符
^、$、\b
\d : [0-9] \D : [^\d]
\s : 空白符 \S : [^\s]
\w : [A-Za-z0-9]
5.量词:出现的次数
{m,n} : m 到 n次之间
* :{0,} 0到无穷次
?: {0,1} 0次或1次
+ :{1,} 1次或1次以上

如果RegExp构造函数第一个参数是一个正则对象,那么可以使用第二个参数指定修饰符。而且,返回的正则表达式会忽略原有的正则表达式的修饰符,只使用新指定的修饰符。

new RegExp(/abc/ig, 'i').flags
// "i"

字符串对象共有 4 个方法,可以使用正则表达式:match()、replace()、search()和split()。

ES6 对正则表达式添加了u修饰符,含义为“Unicode 模式”,用来正确处理大于\uFFFF的 Unicode 字符。也就是说,会正确处理四个字节的 UTF-16 编码。
/^\uD83D/u.test(’\uD83D\uDC2A’) // false/^\uD83D/.test(’\uD83D\uDC2A’) // true
上面代码中,\uD83D\uDC2A是一个四个字节的 UTF-16 编码,代表一个字符。但是,ES5 不支持四个字节的 UTF-16 编码,会将其识别为两个字符,导致第二行代码结果为true。加了u修饰符以后,ES6 就会识别其为一个字符,所以第一行代码结果为false。

一旦加上u修饰符号,就会修改下面这些正则表达式的行为。
点(.)字符在正则表达式中,含义是除了换行符以外的任意单个字符。对于码点大于0xFFFF的 Unicode 字符,点字符不能识别,必须加上u修饰符。

var s = ';
/^.$/.test(s) // false/^.$/u.test(s) // true

ES6 新增了使用大括号表示 Unicode 字符,这种表示法在正则表达式中必须加上u修饰符,才能识别当中的大括号,否则会被解读为量词。
/\u{61}/.test(‘a’) // false/\u{61}/u.test(‘a’) // true/\u{20BB7}/u.test(’) // true
上面代码表示,如果不加u修饰符,正则表达式无法识别\u{61}这种表示法,只会认为这匹配 61 个连续的u。

使用u修饰符后,所有量词都会正确识别码点大于0xFFFF的 Unicode 字符。

/a{2}/.test('aa') // true/a{2}/u.test('aa') // true/.test(') // false/{2}/u.test(') // true

u修饰符也影响到预定义模式,能否正确识别码点大于0xFFFF的 Unicode 字符。

/^\S$/.test(') // false/^\S$/u.test(') // true

上面代码的\S是预定义模式,匹配所有非空白字符。只有加了u修饰符,它才能正确匹配码点大于0xFFFF的 Unicode 字符。

利用这一点,可以写出一个正确返回字符串长度的函数。
(5)i 修饰符
有些 Unicode 字符的编码不同,但是字型很相近,比如,\u004B与\u212A都是大写的K。

/[a-z]/i.test('\u212A') // false/[a-z]/iu.test('\u212A') // true

上面代码中,不加u修饰符,就无法识别非规范的K字符。

(6)转义
没有u修饰符的情况下,正则中没有定义的转义(如逗号的转义,)无效,而在u模式会报错
/,/ // /,//,/u // 报错
上面代码中,没有u修饰符时,逗号前面的反斜杠是无效的,加了u修饰符就报错。

正则实例对象新增unicode属性,表示是否设置了u修饰符。

const r1 = /hello/;
const r2 = /hello/u;

r1.unicode // falser2.unicode // true

除了u修饰符,ES6 还为正则表达式添加了y修饰符,叫做“粘连”(sticky)修饰符。
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"]r2.exec(s) // null

上面代码有两个正则表达式,一个使用g修饰符,另一个使用y修饰符。这两个正则表达式各执行了两次,第一次执行的时候,两者行为相同,剩余字符串都是_aa_a。由于g修饰没有位置要求,所以第二次执行会返回结果,而y修饰符要求匹配必须从头部开始,所以返回null。

使用lastIndex属性,可以更好地说明y修饰符。
const REGEX = /a/g;
// 指定从2号位置(y)开始匹配REGEX.lastIndex = 2;
// 匹配成功const match = REGEX.exec(‘xaya’);
// 在3号位置匹配成功match.index // 3
// 下一次匹配从4号位开始REGEX.lastIndex // 4
// 4号位开始匹配失败REGEX.exec(‘xaya’) // null

上面代码中,lastIndex属性指定每次搜索的开始位置,g修饰符从这个位置开始向后搜索,直到发现匹配为止。

y修饰符同样遵守lastIndex属性,但是要求必须在lastIndex指定的位置发现匹配。
const REGEX = /a/y;
// 指定从2号位置开始匹配REGEX.lastIndex = 2;
// 不是粘连,匹配失败REGEX.exec(‘xaya’) // null
// 指定从3号位置开始匹配REGEX.lastIndex = 3;
// 3号位置是粘连,匹配成功const match = REGEX.exec(‘xaya’);
match.index // 3REGEX.lastIndex // 4

y修饰符号隐含了头部匹配的标志^
y修饰符的设计本意,就是让头部匹配的标志^在全局匹配中都有效

下面是字符串对象的replace方法的例子。
const REGEX = /a/gy;‘aaxa’.replace(REGEX, ‘-’) // ‘–xa’

上面代码中,最后一个a因为不是出现在下一次匹配的头部,所以不会被替换。
单单一个y修饰符对match方法,只能返回第一个匹配,必须与g修饰符联用,才能返回所有匹配。
‘a1a2a3’.match(/a\d/y) // [“a1”]‘a1a2a3’.match(/a\d/gy) // [“a1”, “a2”, “a3”]

y修饰符的一个应用,是从字符串提取 token(词元),y修饰符确保了匹配之间不会有漏掉的字符。

const TOKEN_Y = /\s*(\+|[0-9]+)\s*/y;
const TOKEN_G  = /\s*(\+|[0-9]+)\s*/g;
tokenize(TOKEN_Y, '3 + 4')
// [ '3', '+', '4' ]tokenize(TOKEN_G, '3 + 4')
// [ '3', '+', '4' ]function tokenize(TOKEN_REGEX, str) {
  let result = [];
  let match;
  while (match = TOKEN_REGEX.exec(str)) {
    result.push(match[1]);
  }
  return result;}

上面代码中,如果字符串里面没有非法字符,y修饰符与g修饰符的提取结果是一样的。但是,一旦出现非法字符,两者的行为就不一样了。

tokenize(TOKEN_Y, '3x + 4')
// [ '3' ]tokenize(TOKEN_G, '3x + 4')
// [ '3', '+', '4' ]

上面代码中,g修饰符会忽略非法字符,而y修饰符不会,这样就很容易发现错误。

与y修饰符相匹配,ES6 的正则实例对象多了sticky属性,表示是否设置了y修饰符。

var r = /hello\d/y;
r.sticky // true

ES6 为正则表达式新增了flags属性,会返回正则表达式的修饰符。
// ES5 的 source 属性// 返回正则表达式的正文/abc/ig.source
// “abc”
// ES6 的 flags 属性// 返回正则表达式的修饰符/abc/ig.flags
// ‘gi’

正则表达式中,点(.)是一个特殊字符,代表任意的单个字符,但是有两个例外。一个是四个字节的 UTF-16 字符,这个可以用u修饰符解决;另一个是行终止符(line terminator character)。
所谓行终止符,就是该字符表示一行的终结。以下四个字符属于“行终止符”。
U+000A 换行符(\n)
U+000D 回车符(\r)
U+2028 行分隔符(line separator)
U+2029 段分隔符(paragraph separator)

/foo.bar/.test('foo\nbar')
// false

上面代码中,因为.不匹配\n,所以正则表达式返回false。

但是,很多时候我们希望匹配的是任意单个字符,这时有一种变通的写法。

/foo[^]bar/.test('foo\nbar')
// true

ES2018 引入s修饰符,使得.可以匹配任意单个字符。

/foo.bar/s.test('foo\nbar') // true

这被称为dotAll模式,即点(dot)代表一切字符。所以,正则表达式还引入了一个dotAll属性,返回一个布尔值,表示该正则表达式是否处在dotAll模式。

const re = /foo.bar/s;
// 另一种写法// const re = new RegExp('foo.bar', 's');
re.test('foo\nbar') // truere.dotAll // truere.flags // 's'

/s修饰符和多行修饰符/m不冲突,两者一起使用的情况下,.匹配所有字符,而^和$匹配每一行的行首和行尾。

“先行断言”指的是,x只有在y前面才匹配,必须写成/x(?=y)/。比如,只匹配百分号之前的数字,要写成/\d+(?=%)/。“先行否定断言”指的是,x只有不在y前面才匹配,必须写成/x(?!y)/。比如,只匹配不在百分号之前的数字,要写成/\d+(?!%)/。

/\d+(?=%)/.exec('100% of US presidents have been male')  // ["100"]/\d+(?!%)/.exec('that’s all 44 of them')                 // ["44"]

上面两个字符串,如果互换正则表达式,就不会得到相同结果。另外,还可以看到,“先行断言”括号之中的部分((?=%)),是不计入返回结果的。
“后行断言”正好与“先行断言”相反,x只有在y后面才匹配,必须写成/(?<=y)x/。比如,只匹配美元符号之后的数字,要写成/(?<=$)\d+/。“后行否定断言”则与“先行否定断言”相反,x只有不在y后面才匹配,必须写成/(?<!y)x/。比如,只匹配不在美元符号后面的数字,要写成/(?<!$)\d+/。

/(?<=\$)\d+/.exec('Benjamin Franklin is on the $100 bill')  // ["100"]/(?<!\$)\d+/.exec('it’s is worth about €90')                // ["90"]

上面的例子中,“后行断言”的括号之中的部分((?<=$)),也是不计入返回结果。

下面的例子是使用后行断言进行字符串替换。
const RE_DOLLAR_PREFIX = /(?<=$)foo/g;‘ f o o / / ′ foo %foo foo'.replace(RE_DOLLAR_PREFIX, 'bar'); // ' foo//bar %foo foo’
上面代码中,只有在美元符号后面的foo才会被替换。


本文链接: http://www.dtmao.cc/news_show_550191.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?