考虑一个包含所有十进制数字和所有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);
但它不起作用。
答案 0 :(得分:1)
当您想要AND两个或更多字符范围时,它们应该只是一个接一个地放在单个字符类(或括号表达式)中,其间没有|
或,
。
(?:[\u0030-\u0039]|[\u0061-\u007A])
与[\u0030-\u0039\u0061-\u007A]
相同。
现在,/[\u30-\u39\u61-\u7A]/g
regex等于/[;:?[@\\<->0-9A-TuU-Z]/g
正则表达式,因此匹配:
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。