Страницы

Поиск по вопросам

суббота, 4 января 2020 г.

Регулярное выражение. Поиск повторяющихся цифр

#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))

Комментариев нет:

Отправить комментарий