中文在utf-8字符集的范围为\u4e00-\u9fa5
我用字符串作为正则的pattern传入,
情况1::当我传入\u4e00-\u9fa5
时,可以看到最终的正则为/[一-龥]+/
,如下图:
情况2:当我传入\\u4e00-\\u9fa5
时,可以看到最终的正则为/[\u4e00-\u9fa5]+/
但是令我困惑的是,情况1和情况2是等价的吗?
中文在utf-8字符集的范围为\u4e00-\u9fa5
我用字符串作为正则的pattern传入,
情况1::当我传入\u4e00-\u9fa5
时,可以看到最终的正则为/[一-龥]+/
,如下图:
情况2:当我传入\\u4e00-\\u9fa5
时,可以看到最终的正则为/[\u4e00-\u9fa5]+/
但是令我困惑的是,情况1和情况2是等价的吗?
首先看下定义的两个正则的字面量表达形式:
/[一-龥]+/
/[\u4e00-\u9fa5]+/
由于 JS 的正则表达式支持 Unicode 字符,所以这两个表达式的效果是一样的。
另外,创建 RegExp
对象两种形式:
主要区别就是构造函数的参数是字符类型时,其中的特殊字符需要转义,所以 [\u4e00-\u9fa5]+
对应的字符串就是 '[\\u4e00-\\u9fa5]+'
。
而情况1中的 [一-龥]+
对应的字符串可以直接写为 '[一-龥]+'
,也可以写成 Unicode 字符的形式 '[\u4e00-\u9fa5]+'
。
正则里面 \
需要用 \
来保持,所以 /[\u4e00-\u9fa5]+/
在正则里面就是 /[\\u4e00-\\u9fa5]+/
了。
最后一个问题就是,两者是等价的,因为你匹配数组和字母的时候其实也是用 [0-9]
和 [a-zA-Z]
这样的,转成 unicode
上面那两个就会变成 [\u0030-\u0039]
和 [\u0061-\u007a\u0041-\u005a]
。
如果你要问为什么 matcher
输出的会是转义后的中文,就得看 new RegExp()的具体实现了。
10 回答11.2k 阅读
5 回答4.8k 阅读✓ 已解决
2 回答7k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
正则表达式中的反斜线 (\) 指示以下值之一:
但是如果除去这些情况,碰到转义以后没有特殊意思的字符,它返回了字符本身,比如^-?[1-9]\d*$** 可以匹配所有整数,把它改成 **^-?[\1-\9]\d*$ 效果是一样的, 但不排除在有些编程语言中应实现方现方式不同而造成不同的情况