字符串和正则表达式
字符串
《深入理解ES6》中对于ES6编码的介绍内容不是很多,只需要知道相比于ES5,ES6引入了代理对,也就是说使用两个16位的编码单元表示一个码位,在处理一些生僻字而言时可能需要注意一下,但是笔者在写博客的时候,输入法无法打出书中的例子,而且个人感觉确实在实际生产中用处不是很大,就不详细介绍了。
normalize()方法
在对于多种语言的时候,可能会需要用到normalize()方法,前面也提到对于一些生僻文字,会引入代理对来编码(2个16位),而一般的字符都是16位的,在处理排序等业务的时候,需要注意一下编码顺序。
string.normalize([form])
-
NFC:规范化形式Canonical Composition。
-
NFD:规范化形式规范分解。
-
NFKC:标准化形式兼容性组合物。
-
NFKD:规范化形式兼容性分解。
其实感觉实际操作中基本上用不到,可忽略
正则表达式
《深入理解ES6》中对于正则表达式的介绍主要是介绍相比于ES5的新特性,对于没有基础的同学而言不是很友好。而且这些新特性实用性有限,就不按照书上的来整理了。
没有基础的同学可以先去菜鸟教程上学习一下正则表达式的基础。
ECMAScript
通过RegExp
类型来支持正则表达式。
创建正则表达式的方法有两种
// 1. 方法一
var expression = / pattern / flags;
// 2. 方法二
var expression = new RegExp('d', 'g');
其中的模式(pattern)部分为正则表达式。每个正则表达式都可以带有一或多个标志,用以标明正则表达式的行为。
- g:表示全局模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止
- i:表示不区分大小写,记载确定匹配项时忽略模式与字符串的大小写。
- m:表示多行模式,即在到达一行文本末尾时会继续查找下一行中是否存在与模式匹配的项。
语法
元字符
字符 | 描述 |
---|---|
将下一个字符标记为特殊字符|原义字符|向后引用|八进制转义符 | |
^ | 匹配输入字符串的开始位置 |
$ | 匹配输入字符串的结束位置 |
* | 匹配前面的子表达式零次或多次,等价于{0,} |
+ | 匹配前面的子表达式一次或多次,等价于{1,} |
? | 匹配前面的表达式,等价于{0,1};当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。 |
. | 匹配出换行符 之外的任何单个字符 |
| | 或 |
[] | 字符集合 |
[^abc] | 负值字符集合,非 |
{} | 匹配前面子表达式的次数,例如{n},{n,},{n,m} |
转义字符
字符 | 描述 |
---|---|
匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。 | |
B | 匹配非单词边界。'erB' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。 |
cx | 匹配由 x 指明的控制字符。例如, cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。 |
d | 匹配一个数字字符。等价于 [0-9]。 |
D | 匹配一个非数字字符。等价于 [ ^0-9]。 |
f | 匹配一个换页符。等价于 x0c 和 cL。 |
匹配一个换行符。等价于 x0a 和 cJ。 | |
匹配一个回车符。等价于 x0d 和 cM。 | |
s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ f v]。 |
S | 匹配任何非空白字符。等价于 [ ^f v]。 |
匹配一个制表符。等价于 x09 和 cI。 | |
v | 匹配一个垂直制表符。等价于 x0b 和 cK。 |
w | 匹配字母、数字、下划线。等价于'[A-Za-z0-9_]'。 |
W | 匹配非字母、数字、下划线。等价于 '[ ^A-Za-z0-9_]'。 |
xn | 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,'x41' 匹配 "A"。'x041' 则等价于 'x04' & "1"。正则表达式中可以使用 ASCII 编码。 |
um | 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)1' 匹配两个连续的相同字符。 |
标识一个八进制转义值或一个向后引用。如果 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。 | |
m | 标识一个八进制转义值或一个向后引用。如果 m 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 m 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 m 将匹配八进制转义值 nm。 |
ml | 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。 |
un | 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, u00A9 匹配版权符号 (?)。 |
优先级
运算符 | 描述 |
---|---|
转义符 | |
(), (?: ), (?=), [] | 圆括号和方括号 |
*, +, ?, {n}, {n,}, {n,m} | 限定符 |
^, $, 任何元字符、任何字符 | 定位点和序列(即:位置和顺序) |
| | 替换,"或"操作 字符具有高于替换运算符的优先级,使得"m|food"匹配"m"或"food"。若要匹配"mood"或"food",请使用括号创建子表达式,从而产生"(m|f)ood"。 |
RegExp 对象属性
属性 | 描述 |
---|---|
global | RegExp 对象是否具有标志 g。 |
ignoreCase | RegExp 对象是否具有标志 i。 |
lastIndex | 一个整数,标示开始下一次匹配的字符位置。 |
multiline | RegExp 对象是否具有标志 m。 |
source | 正则表达式的源文本。 |
RegExp 对象方法
方法 | 描述 |
---|---|
compile | 编译正则表达式。 |
exec | 检索字符串中指定的值。返回找到的值,并确定其位置。 |
test | 检索字符串中指定的值。返回 true 或 false。 |
支持正则表达式的 String 对象的方法
方法 | 描述 |
---|---|
search | 检索与正则表达式相匹配的值。 |
match | 找到一个或多个正则表达式的匹配。 |
replace | 替换与正则表达式匹配的子串。 |
split | 把字符串分割为字符串数组。 |
模板字面量
ES6通过模板字面量的方式对ES5进行了补充:
- 多行字符串:一个正式的多行字符串的概念
- 基本的字符串格式化:将变量的值嵌入字符串的能力
- HTML转义:向HTML插入进过安全转换后的字符串的能力
var s = `
hello world!
你好,世界!
`.trim()
console.log(s)
hello world!
你好,世界!
字符串占位符
占位符由${}
构成,中间可以插入js表达式
let name = 'UZI'
var s = `
${name},永远滴神
`.trim()
console.log(s)
UZI,永远滴神
let price = 10, num = 5
var s = `
单价:¥${price},数量:${num},总价:¥${(num * price).toFixed(2)}
`.trim()
console.log(s)
单价:¥10,数量5,总价:¥50.00
标签模板
定义标签
定义标签时,会传入两个参数(这里用literals,substitutions举例)
第一个参数是一个数组,为字符串中以占位符为分割的字符串数组。例如单价:¥${price},数量:${num},总价:¥${(num * price).toFixed(2)}
按照占位符分割之后就是单价:¥
, ,数量:
, ,总价:¥
第二个参数也是一个数组,为占位符中的解释值,例如这个例子中有三个个占位符,解释值分别为10
,5
,50.00
注意:如果是以占位符开头或者结尾,第二个参数中也会体现占位符前后的内容,比如${(num * price).toFixed(2)}
结尾,但是第二个参数的最后一个元素为空字符串,这就保证了第二个参数的数组长度永远比第一个参数的数组长度多1.
function tag(literals, ...substitutions){
console.log(literals)
console.log(substitutions)
return "hello world"
}
let price = 10, num = 5
var s = tag`单价:¥${price},数量:${num},总价:¥${(num * price).toFixed(2)}`
console.log(s)
[ '单价:¥', ',数量:', ',总价:¥', '' ]
[ 10, 5, '50.00' ]
hello world
使用原始值
模板标签可以访问原生字符串信息,通过模板标签可以访问到字符串被转换成等价字符前的原生字符串,如利用String.raw()
let s1 = `hello
world`
let s2 = String.raw`hello
world`
let s3 = String.raw`hello
world`
console.log(s1)
console.log(s2)
console.log(s3)
hello
world
hello
world
hello
world