Как включить несколько диапазонов Unicode в один набор (класс) или группу символов? - PullRequest
0 голосов
/ 05 июня 2018

Рассмотрим набор, который включает все десятичные цифры и все строчные латинские символы.Я хочу включить их в один набор (или группу), используя обозначения для диапазонов 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 голосов
/ 05 июня 2018

Если вы хотите использовать 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...