Как сгруппировать следующие строки по регулярному выражению - PullRequest
0 голосов
/ 27 декабря 2018

Это строка, которую я хочу обработать. (По крайней мере, одна из подчеркнутых частей. Последняя часть никогда не подчеркивается)

'_A._B._C._D._F.f'`

Я ожидал

["A", "B", "C", "D", "F", "f"]

КакЯ пытался добиться того же эффекта регулярностью, но не могу зациклить ту же часть формата.

new RegExp('^[(_(.+)\\.)]+(.+)$')

Ответы [ 5 ]

0 голосов
/ 27 декабря 2018

В своем регулярном выражении вы пытаетесь сопоставить весь шаблон, используя якорь ^, чтобы утверждать начало строки, за которым следует класс символов , который будет соответствовать только одному из нескольких символов (и можетПример также должен быть записан как [_(+\\.)]+), а затем вы захватываете остальную часть строки в группе захвата и утверждаете конец строки $.

Если вы хотите сначала проверить формат строкиВы можете использовать более точный шаблон.Когда этот шаблон соответствует, вы можете выполнить регистронезависимое сопоставление для одного символа, так как шаблон уже проверен:

const regex = /^_[A-Z](?:\._[A-Z])+\.[a-z]$/;
const str = `_A._B._C._D._F.f`;

if (regex.test(str)) {
  console.log(str.match(/[a-z]/ig));
}

См. Демо regex

Это будет соответствовать:

  • ^ Подтвердить началостроки
  • _[A-Z] Соответствует символу подчеркивания и заглавной буквы
  • (?:\._[A-Z])+ 1+ раз повторяющаяся структура группировки соответствует ._, за которой следует заглавная буква
  • \.[a-z] Совпадение точки и строчных букв
  • $ Утверждение конца строки
0 голосов
/ 27 декабря 2018

строковый метод .match с глобальным флагом, может помочь вам:

console.log('_A._B._C._D._F.f'.match(/[a-z]+/gi))
0 голосов
/ 27 декабря 2018

Вы можете исключить точку и подчеркивание из соответствия.

var string = '_A._B._C._D._F.f',
    result = string.match(/[^._]+/g);

console.log(result);
0 голосов
/ 27 декабря 2018

Как насчет этого без использования регулярных выражений?

str = '_A._B._C._D._F.f'.split('.')
var alphabets = str.map(c => c.replace('_', ''));
console.log(alphabets);
0 голосов
/ 27 декабря 2018

Вы можете использовать split, который удаляет [._]+ (любая подстрока, содержащая точки или этажи) и filter (чтобы удалить начальную пустую строку):

'_A._B._C._D._F.f'.split(/[._]+/).filter(function(s){ return s.length > 0})
# => [ "A", "B", "C", "D", "F", "f" ]

РЕДАКТИРОВАТЬ: Упрощение, предлагаемое вкомментарии:

'_A._B._C._D._F.f'.split(/[._]+/).filter(Boolean)
# =>  [ "A", "B", "C", "D", "F", "f" ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...