正则表达式中中文的转义后的字符和unicode码点表示有啥区别吗?

中文在utf-8字符集的范围为\u4e00-\u9fa5
我用字符串作为正则的pattern传入,

情况1::当我传入\u4e00-\u9fa5时,可以看到最终的正则为/[一-龥]+/,如下图:
image.png
情况2:当我传入\\u4e00-\\u9fa5时,可以看到最终的正则为/[\u4e00-\u9fa5]+/
image.png

但是令我困惑的是,情况1和情况2是等价的吗?

阅读 3.2k
3 个回答

正则表达式中的反斜线 (\) 指示以下值之一:

  • 后接字符为特殊字符。 例如,\b 是定位标记,用于指示正则表达式的匹配应从单词边界开始,\t 表示制表符,而 \x020 表示空格。
  • 本应解释为未转义语言构造的字符应按字面意思进行解释。 例如,大括号 ({) 开始定义限定符,而反斜杠后接大括号 ({) 表示正则表达式引擎应匹配大括号。 同样,单个反斜杠标记转义的语言构造的开始,而两个反斜杠 (\) 表示正则表达式引擎应匹配反斜杠。

但是如果除去这些情况,碰到转义以后没有特殊意思的字符,它返回了字符本身,比如^-?[1-9]\d*$** 可以匹配所有整数,把它改成 **^-?[\1-\9]\d*$ 效果是一样的, 但不排除在有些编程语言中应实现方现方式不同而造成不同的情况

首先看下定义的两个正则的字面量表达形式:

  • /[一-龥]+/
  • /[\u4e00-\u9fa5]+/

由于 JS 的正则表达式支持 Unicode 字符,所以这两个表达式的效果是一样的。

另外,创建 RegExp 对象两种形式:

  1. 字面量
  2. 构造函数

主要区别就是构造函数的参数是字符类型时,其中的特殊字符需要转义,所以 [\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()的具体实现了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题