Как сгенерировать строку или массив с каждым не буквенным или числовым символом? - PullRequest
0 голосов
/ 08 июля 2020

Есть ли способ перебрать все известные символы, отфильтровать буквы и цифры, а затем поместить их в массив или строку? ?

Что-то вроде…

const myChars = [some method to generate every QWERTY character I could type] ??‍♂️
let regex = new RegExp[anything not a letter or number])
const aRaw = myChars.split("")
const clean = aRaw.filter((e) => e.match(regex))
return clean // leaving me with a master array of all special characters! Muhhahahaha

Примечание! Я не хочу УДАЛИТЬ эти символы из строки. Я хочу "автоматически" сгенерировать их. Также не "случайным образом генерируемые символы" из данной строки.

Ответы [ 2 ]

1 голос
/ 08 июля 2020

Если вас интересует небольшое ограниченное подмножество возможных символов (например, utf 16), ваш изложенный подход будет правильным и легко заполнить:

let utf16Chars = [...Array(0xFFFF)].map((_, i) => String.fromCharCode(i));
let alphaNumeric = /[a-zA-Z0-9]/;
let symbols = utf16Chars.filter(e => !e.match(alphaNumeric));

console.log(symbols.length);
console.log(symbols.slice(0,100));

Честно говоря, я ужасно мало знаю о терминологиях UTF, ASCII, Unicode ... et c. Так что простите меня, если я ошибаюсь. Но это сообщение SO предполагает, что UTF 16 может быть тем, что вы ищете, а это сообщение mdn предполагает, что 0-0xffff должен дать вам символы UTF.

0 голосов
/ 08 июля 2020

Для записи: если вы собираетесь использовать список из @junvar, не пытайтесь использовать его внутри регулярного выражения. Это не будет работать, как показано в приведенном ниже коде. Попробуйте сделать что-то похожее на forEach под регулярным выражением. Обратите внимание, что запуск занимает много времени. Лучше не вставлять это во все, что требует скорости.

let utf16Chars = [...Array(0xFFFF)].map((_, i) => String.fromCharCode(i));
let alphaNumeric = /[\w\d]/;
let symbols = utf16Chars.filter(e => !e.match(alphaNumeric));

let ixSlash = symbols.findIndex(s=>s=='\\');
symbols[ixSlash] = '\\\\';

let rgxStr = '[' + symbols.join('') + ']';

let regEx = new RegExp(rgxStr, 'g');

let str = '(NT*B&TIUSDSJHni7*B&TY*&';
console.log('Regex match:', str.match(regEx)); //doesn't work

symbols.forEach(s=>{
  let ix = str.indexOf(s);
  if (ix >= 0) console.log('Match at position ' + ix + ' (' + s + ')');
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...