#javascript #регулярные_выражения
Есть вот такая строка: ---011110000----- Нужно найти 3 повторяющиеся цифры если нет 4-ёх повторяющихся цифр. Например: ---011110000----- не должно быть совпадений ---01110000------ должно совпасть только с 111 -----0111000----- должно совпасть и с 000 и с 111 Помогите составить регулярку для JavaScript. P.S. ((?=(\d{1}))\2{3}) это выражение даст совпадение в каждом примере...
Ответы
Ответ 1
А как на счёт двух регулярок? '---011110000-----'.replace(/(\d)\1{3}/g,'-').match(/(\d)\1{2}/g) → null '---011110000-----'.replace(/(\d)\1{3}/g,'-').match(/(\d)\1{2}/g) → ["111"] '-----0111000-----'.replace(/(\d)\1{3}/g,'-').match(/(\d)\1{2}/g) → ["111", "000"] С одной регуляркой удалось только захватить символ, после которого идёт тройка: '---011110000-----'.match(/(.)(?=(\d)\2{2}(?!\2))(?!\1)/g) → null '---01110000------'.match(/(.)(?=(\d)\2{2}(?!\2))(?!\1)/g) → ["0"] '-----0111000-----'.match(/(.)(?=(\d)\2{2}(?!\2))(?!\1)/g) → ["0", "1"]Ответ 2
Частный случай, который подходит под нужды ТС довольно прост: (?=.(\d))(?!\1)(?=.(\1{3})(?!\1)) https://regex101.com/r/yT5sD9/1 Гораздо интереснее сформулировать задачу так: Найти непрерывную последовательность, состоящую из литерала, повторенного N раз. Здесь уже решение будет весьма нетривиальным за счет слишком малого функционала регулярных выражений в JavaScript. Решение выглядит так: (?:(?=((?=([^]))(?=\2{0,2}(?!\2)|\2{4,}(?!\2))\2+(?!\2)))\1)*(([^])\4{2}(?!\4)) Кратко его можно описать так: Сымитировав атомарную группировку захватываем все непрерывные последовательности длиной, отличной от N, а после этого захватываем непрерывную последовательность длиной N. Результат в четвертой группе (результатом считается любой символ повторенный подряд ровно 3 раза, не только цифры) Посмотреть можно здесь: https://regex101.com/r/yT5sD9/2 Общий вид в зависимости от N: (?:(?=((?=([^]))(?=\2{0,[N-1]}(?!\2)|\2{[N+1],}(?!\2))\2+(?!\2)))\1)*(([^])\4{[N-1]}(?!\4))
Комментариев нет:
Отправить комментарий