Разбить строку на цифры + спецсимволы и буквы

Рейтинг: 1Ответов: 1Опубликовано: 11.07.2023

Помогите с регулярным выражением. Нужно из строки с цифрами, буквами и спец символами получить отдельно цифры + спецсимволы + буквы. Моя попытка

var chars = str.slice(0, str.search(/[a-zA-Z]+/));
var numbs = str.replace(chars, '');

В результате если нет букв, то в буквы записывается символ из строки. Желаемый результат получить две переменные в первой все до 1 буквы, в остальной все после первой буквы

Ответы

▲ 0

Ну например вот так. Просто каждому совпадению даёшь группу, если в первых 2 не попало, то . забирает остальное. А оператор (?: ) говорит что эту группу не учитывать...

let s = "ccJIvd(X49YkZyDdm)eI(*Sf+^ngZtpw"
let ok = s.matchAll(/(?:([A-Z])|([0-9])|(.))/ig)

let tokens = [...ok].map(function(token) {
   let [match, is_char, is_number, is_token] = token;
   if ( is_char ) return [match, 'char', token.index];
   if ( is_number ) return [match, 'number', token.index];
   if ( is_token ) return [match, 'token', token.index];
})

console.log(tokens)

Добавлено спустя, читаем комментарии

let s = "123><?321абв123123";
let ok = s.matchAll(/(?:([A-ZА-Я])|([0-9])|(.))/ig);

let {first, second} = [...ok].map(function(token) {
   let [match, is_char, is_number, is_token] = token;
   if ( is_char ) return [match, 'char', token.index];
   if ( is_number ) return [match, 'number', token.index];
   if ( is_token ) return [match, 'token', token.index];
}).reduce(function(collection, [match, type]) {
if (collection.is_letter_found) {
    collection.second += match;
} else if (type === "char") {
    collection.is_letter_found = true;
    collection.second += match;
} else {
    collection.first += match;
}
return collection;
}, {is_letter_found: false, first: "", second: ""});

console.log(first, second);  // 123><?321  абв123123