Если вы хотите использовать AND для двух или более диапазонов символов, они должны просто помещаться один за другим внутри одного класса символов (или выражения в скобках) без |
или ,
между ними.
(?:[\u0030-\u0039]|[\u0061-\u007A])
совпадает с [\u0030-\u0039\u0061-\u007A]
.
Теперь /[\u30-\u39\u61-\u7A]/g
регулярное выражение равно /[;:?[@\\<->0-9A-TuU-Z]/g
регулярное выражение, поэтому оно соответствует:
- все цифры ASCII
- все заглавные буквы ASCII
- a
u
буква, ;
, :
, ?
, [
, @
, \
, <
, =
, >
.
Это происходит потому, что \uXX
является недопустимой escape-последовательностью, но JS не выдает исключение и просто обрабатывает\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);
Вы можете использовать сокращенную запись, \u{XX}
с ES6 + u
регулярными выражениями "помеченными":
var str1 = "~ABCDa0b1cdef2Zgh34ijkYXlmnopqEF~";
var str2 = str1.replace(/[\u{30}-\u{39}\u{61}-\u{7A}]/ug, "_");
console.log(str2);
Или это можно записать как /[\x30-\x39\x61-\x7A]/g
.
Подробнее о том, как использовать кодовые точки Unicode в регулярных выражениях Java наMDN .