Я пытаюсь сгруппировать все повторяющиеся буквы в строку.
Eg:
"aaaaaaabbbbbbbbc" => [['aaaaaaa'],['bbbbbbbb'],['c']]
Используя логику и Ruby, я нашел единственный способ достичь своей цели:
.scan(/(?:a+|A+)|(?:b+|B+)|(?:c+|C+)| ..... (?:y+|Y+)|(?:z+|Z+))
где ...
— остальные буквы алфавита.
Есть ли способ высушить это регулярное выражение? Я также использовал обратную трассировку (\1)
, но она не соответствует отдельным словам и не возвращает точное совпадение букв => (\w+)\1
=> [['aa'],['bb']]
Хм, я ошибаюсь, используя регулярные выражения для этого случая, и я должен использовать методы Ruby с итерациями?
Буду рад услышать ваше мнение :) Спасибо!
map(&:first)
. Как String#scan работает с группами это как тот обоюдоострый меч, который вы держите в руках: он либо удобен, либо, как здесь, раздражает. 29.10.2017\<group_number>
для обозначения соответствующих захваченных символов, скажем,\1
относится к символам, которые захватываются первой группой захвата()
, тогда как\2
относится ко второй группе захвата. Так же продолжается. Итак, здесь(\w)
должен захватить все символы слова, а(\w)\1*
соответствует всем символам слова, а также следующим 0 или более повторяющимся символам. скажем, он соответствуетb
,nn
,b
во входной строкеbnnb
. Поскольку функцияscan
возвращает только захваченные символы, я снова помещаю все регулярное выражение в другую группу. 11.12.2018\1
, это все еще относится к первой группе, но нам нужна вторая, поэтому я использовал\2
11.12.2018