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