Skip to content

Instantly share code, notes, and snippets.

@antyakushev
Last active September 17, 2018 10:46
Show Gist options
  • Save antyakushev/aa614afd6aa0a721222748caefebff5d to your computer and use it in GitHub Desktop.
Save antyakushev/aa614afd6aa0a721222748caefebff5d to your computer and use it in GitHub Desktop.
Split RegExp

Как разделить строку '1234567890123456' на 4 равные части лишь с помощью split?

Едва ли это можно сделать, передавая в split строку. Хорошо, что этот метод принимает ещё и регулярки.

Сначала надо понять что в нашем случае должно матчить регулярное выражение. А ничего, пустоту! Но в определённых местах. Чтобы ничего не матчить, воспользуемся positive lookbehind

?<=

Нам надо заматчить пустоту после каждых четырёх символов:

'1234567890123456'.split(/(?<=(.{4})+)/)

Попробуем.

["1234", "1234", "5", "2345", "6", "3456", "7", "4567", "8", "1234", "9", "2345", "0", "3456", "1", "4567", "2", "1234", "3", "2345", "4", "3456", "5", "4567", "6"]

Что-то не то. Идём на MDN и узнаём, что

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

Всё понятно – скобочки, в которые мы взяли четыре символа .{4}, чтобы повторить их с помощью +, образовали группу, и она тоже складывается в итоговый массив. Добавим ?:, чтобы получить non-capturing group


'1234567890123456'.split(/(?<=(?:.{4})+)/)

И так…

["1234", "5", "6", "7", "8", "9", "0", "1", "2", "3", "4", "5", "6"]

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

'1234567890123456'.split(/(?<=^(?:.{4})+)/)

Вуаля.

["1234", "5678", "9012", "3456"]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment