Как слово символ интерпретируется в классе символов? - PullRequest
2 голосов
/ 13 июня 2019

\w - обозначает [A-Za-z0-9_] Класс символов

Но я не могу понять, как он интерпретируется внутри класса символов.

Так что, когда я использую

[\w-~]

let test = (str) => /^[\w-~]+$/.test(str)

console.log(test("T|"))

сбой для T|

, но когда я использую

[A-Za-z0-9_-~]

let test = (str) => /^[A-Za-z0-9_-~]+$/.test(str)

console.log(test("T|"))

это приводит к истине,

Я не могу понять, как эти два выражения отличаются друг от друга?

Ответы [ 3 ]

2 голосов
/ 13 июня 2019

Я считаю, что главное различие между вашими примерами - это местоположение вашего персонажа. Здесь происходит то, что в этом примере:

let test = (str) => /^[A-Za-z0-9_-~]+$/.test(str)

console.log(test("T|"))

Это оценивается как диапазон, например:

let test = (str) => /^[_-~]+$/.test(str)

console.log(test("|"))

вернет true .

Где в этом:

let test = (str) => /^[\w-~]+$/.test(str)

console.log(test("T|"))

Поскольку \ w представляет собой набор символов сам по себе, он оценивает символ - сам по себе.

Положение - и его окружение могут иметь огромное значение в том, как они интерпретируются.

Вы можете вообще избежать этой ситуации, переместив ее в конец, вот так:

let test = (str) => /^[A-Za-z0-9_~-]+$/.test(str)

console.log(test("T|"))

, который вернет false

0 голосов
/ 13 июня 2019

Кажется, я нашел проблему, это из-за диапазонов:

^[A-Za-z0-9_~-]+$

Это выражение не пропустит, что, очевидно, этот _-~ является диапазоном, который будет проходить от этого символа в ASCII _ до ~, который включает в себя }, { и |.

Демо 1

Демо 2

0 голосов
/ 13 июня 2019

Я думаю, диапазон делает все здесь, когда вы используете ^[A-Za-z0-9_-~]+$

_-~ соответствует одному символу в диапазоне между _ (индекс 95) и ~ (индекс 126) (с учетом регистра), поэтому T| сопоставляется и возвращает true, но когда вы используете ^[\w-~]+$, это не формируется ни один диапазон символов, таких как _-~, для совпадения, поэтому происходит сбой и возвращается false

См. ^[A-Za-z0-9-~]+$ также возвращает false, поскольку он не включает символ _, чтобы задать диапазон _-~ между _ (индекс 95) и ~ (индекс 126)

let test = (str) => /^[A-Za-z0-9-~]+$/.test(str)

console.log(test("T|"))

См. https://regex101.com/r/vbLN9L/5 здесь, в разделе ОБЪЯСНЕНИЕ .

...