如何在单个集合(类)或字符组中包含多个Unicode范围?

时间:2018-06-05 07:08:18

标签: javascript regex unicode

考虑一个包含所有十进制数字和所有Basic Latin小写字符的集合。我想使用Unicode范围的表示法将它们包含在单个集合(或组)中。可能吗?

我尝试了以下内容:

var str1 = "ABCDa0b1cdef2Zgh34ijkYXlmnopqEF";
var str2 = str1.replace(/(?:[\u30-\u39]|[\u61-\u7A])/g, "_");
console.log(str2);

或者这个:

var str1 = "ABCDa0b1cdef2Zgh34ijkYXlmnopqEF";
var str2 = str1.replace(/[\u30-\u39\u61-\u7A]/g, "_");
console.log(str2);

但它不起作用。

1 个答案:

答案 0 :(得分:1)

当您想要AND两个或更多字符范围时,它们应该只是一个接一个地放在单个字符类(或括号表达式)中,其间没有|,

(?:[\u0030-\u0039]|[\u0061-\u007A])[\u0030-\u0039\u0061-\u007A]相同。

现在,/[\u30-\u39\u61-\u7A]/g regex等于/[;:?[@\\<->0-9A-TuU-Z]/g正则表达式,因此匹配:

  • 所有ASCII数字
  • 所有ASCII大写字母
  • u封信,;:?[@\,{{1 },<=

这是因为>是一个无效的转义序列,但是JS不会抛出异常而只是将\uXX视为\u,然后像这样解析范围:

u

您需要使用\u matches the character u literally (case sensitive) 3 matches the character 3 literally (case sensitive) 0-\u a single character in the range between 0 (index 48) and u (index 117) (case sensitive) 39 matches a single character in the list 39 (case sensitive) \u matches the character u literally (case sensitive) 6 matches the character 6 literally (case sensitive) 1-\u a single character in the range between 1 (index 49) and u (index 117) (case sensitive) 7A matches a single character in the list 7A (case sensitive) 表示法:

\uXXXX

您可以使用缩写符号,var str1 = "~ABCDa0b1cdef2Zgh34ijkYXlmnopqEF~"; var str2 = str1.replace(/[\u0030-\u0039\u0061-\u007A]/g, "_"); console.log(str2);与ES6 + \u{XX}“已标记为”正则表达式:

u

或者,这可以写成var str1 = "~ABCDa0b1cdef2Zgh34ijkYXlmnopqEF~"; var str2 = str1.replace(/[\u{30}-\u{39}\u{61}-\u{7A}]/ug, "_"); console.log(str2);

查看更多details on how to use Unicode code points in Java regexes at MDN