Поскольку вы хотите, чтобы эти "элементы" появлялись в любом порядке, вам лучше написать немного кода на Ruby, который просматривает строку от начала до конца и считает количество As, Bs и Cs,находит, содержит ли она желаемую подстроку.Если число As, Bs и Cs находится в желаемых пределах и содержит искомую подстроку, а ее длина (то есть количество символов) равна длине искомой подстроки плюс число As, плюсКоличество символов B, плюс количество символов C, плюс не более N символов, более того, тогда строка хорошая, в противном случае она плохая.На самом деле, чтобы быть осторожным, вы должны сначала найти нужную подстроку, а затем удалить ее из исходной строки, а затем подсчитать количество As, Bs и Cs, поскольку в противном случае вы можете непреднамеренно подсчитать As, Bи C, которые появляются в нужной вам строке, если они там есть.
Вы можете делать то, что хотите, с помощью регулярного выражения, но это будет длинное уродливое регулярное выражение.Зачем?Потому что вам понадобится отдельный «регистр» в регулярном выражении для каждого из возможных порядков элементов.Например, регулярное выражение «^ ABC..XY $» будет соответствовать любой строке, начинающейся с «ABC» и заканчивающейся «XY» и имеющей два символа подстановки в середине.Но только в таком порядке.Если вам нужно регулярное выражение для всех возможных порядков, вам нужно перечислить все эти порядки в регулярном выражении, например, оно должно начинаться примерно так: «^ (ABC..XY | ACB..XY | BAC..XY |BCA..XY | "и дальше, примерно с 5! = 120 различными порядками для этого списка из 5 элементов, тогда вам понадобится больше для случаев, когда не было A, а затем больше для случаев, когда не былоB и т. Д. Я думаю, что регулярное выражение - неподходящий инструмент для этой работы.