Проблема
Немає простого способу отримати перестановку за допомогою регексу.
- Перестановка: отримання слова ("aabc") в інший порядок, не змінюючи числа чи виду літер.
- Регекс: регулярне вираження.
Для перевірки:
- "Перестановки Regex без повторень" Відповідь створює код JavaScript замість регулярного вираження, припускаючи, що це буде простіше.
- "Як знайти всі перестановки даного слова в заданому тексті" - У відповіді також не використовуються регулярні вирази.
- "Regex відповідає всім {1, 2, 3, 4} без повторення" - У відповіді використовуються регулярні вирази, але це не є ні адаптованим, ні простим.
- Ця відповідь навіть стверджує: "Звичайний вираз не може робити те, що ви просите. Він не може генерувати перестановки з рядка" .
Рішення, яке я шукаю
Він повинен мати форму:
- "Aabc" (або будь-що інше, що ви можете використовувати дужки, що відкриваються і закриваються)
- (aabc)! (схоже на (abc)? але з іншим символом в кінці)
- [aabc]! (подібно до [abc] +, але в кінці іншого символу)
Переваги цих рішень
Вони є:
- легко
- пристосований
- багаторазове використання
Чому це повинно існувати
- Регекси - це спосіб описати граматику звичайної мови. Вони мають повну силу бути будь-яким регулярним мовою.
- Скажімо, звичайні мови досить потужні для перестановок (доказ нижче) - чому не існує простого способу висловити це?
Отже, моє питання:
- (Чому) Мій доказ помиляється?
- Якщо це правильно: Чому не існує простого способу вираження перестановок?
Доказ
- Регулярні вирази - це один із способів відзначити граматику звичайної мови. Вони можуть описати будь-які звичайні граматики мов.
- Іншим способом опису будь-яких регулярних мов (у яких є обмежена кількість літер в алфавіті) є недетерміновані Автомати (з обмеженою кількістю станів).
Маючи обмежену кількість літер, я можу створити цей автомат: (Приклад. Формально: див. Нижче)
Граматика, яка приймає перестановки "abbc":
(Вибачте цифри зверху, можливо, хтось знає, як зробити цю деталь кращою)
s -> ах¹
s -> bh²
s -> ch³
h¹ -> bh¹¹
h¹ -> ch¹²
h² -> ah¹¹ (немає друкарської еквівалентності)
h² -> bh²²
h² -> ch²³
h³ -> ах¹²
h³ -> bh²³
h¹¹ -> bc
h¹¹ -> cb
h¹² -> bb
h²² -> змінна
h²² -> ca
h²³ -> ab
h²³ -> ба
Більш офіційне: (використовуючи автоматику з кінцевим станом, але це може бути зроблено і з граматикою)
- Слово q (з кінцевою довжиною), до якого будь-яка перестановка повинна досягати приймаючого стану.
- X - кінцевий алфавіт.
- Набір станів S містить будь-який порядок літер до довжини q. (Отже, розмір S кінцевий.) Плюс один стан "будь-якого більше слова".
- функція переходу стану d, яка приймає літеру і переходить на стан, що відповідає прочитаній частині слова.
- F - це набір тих станів, які є точними перестановками q.
Таким чином, можна створити автоматику з кінцевим станом для прийому перестановок даного слова.
Переходимо з доказом
Тож я довів, що звичайні мови мають право перевіряти перестановки, чи не так?
То чому не існує підходу, щоб досягти цього за допомогою Regexes? Це корисна функціональність.
^(a()|a()|b()|c()){4}\2\3\4\5$
здається, працює (див. Regex101.com/r/9URPpg/4/tests ).