Проблема
Нет простого способа получить перестановку с помощью регулярного выражения.
- Перестановка: Получение слово ( «ААБК») в другом порядке, без изменения числа или рода писем.
- Regex: Регулярное выражение.
Для подтверждения:
- «Перестановки регулярных выражений без повторения» Ответ создает код JavaScript вместо регулярного выражения, предполагая, что это будет более простым.
- «Как найти все перестановки данного слова в данном тексте» - в ответе также не используются регулярные выражения.
- «Regex для соответствия всем {1, 2, 3, 4} без повторений» - в ответе используются регулярные выражения, но он не является ни адаптивным, ни простым.
- Этот ответ даже утверждает: «Регулярное выражение не может делать то, что вы просите. Оно не может генерировать перестановки из строки» .
Тип решения, которое я ищу
Должен иметь форму:
- »Aabc« (или все, что вы могли бы использовать открывающие и закрывающие скобки)
- (AABC)! (аналогично (abc)? но с другим символом в конце)
- [AABC]! (аналогично [abc] +, но с другим символом в конце)
Преимущества этих решений
Они есть:
- легко
- адаптируются
- многоразовый
Почему это должно существовать
- Регулярные выражения - это способ описания грамматики обычного языка. У них есть полная возможность быть любым обычным языком.
- Скажем, обычные языки достаточно мощны для перестановок (доказательство ниже) - почему нет простого способа выразить это?
Итак, мой вопрос:
- (Почему) Мое доказательство неверно?
- Если это правильно: почему нет простого способа выразить перестановки?
Доказательство
- Регулярные выражения являются одним из способов отметить грамматику обычного языка. Они могут описать любую грамматику обычных языков.
- Еще один способ описать грамматику любых обычных языков (которые имеют конечное число букв в алфавите) - это недетерминированные автоматы (с конечным числом состояний).
Имея конечное количество букв, я могу создать этот автомат: (Пример. Формально: см. Ниже)
Грамматика, которая принимает перестановки "abbc":
(извините за числа сверху, может кто-то знает, как сделать эту часть лучше)
s -> ах
s -> чч
с -> ч³
h¹ -> bh¹¹
ч¹ -> ч¹²
h² -> ах¹¹ (нет опечатки! эквивалентность)
h² -> bh²²
ч² -> ч²³
ч³ -> ах¹²
ч³ -> чч³
ч¹¹ -> до н.э
h¹¹ -> cb
h¹² -> бб
h²² -> ac
h²² -> ca
h²³ -> ab
ч²³ -> ба
Более формально: (используя конечный автомат, но это можно сделать и с помощью грамматики)
- Слово q (с конечной длиной), которому любая перестановка должна достичь принимающего состояния.
- Х это конечный алфавит.
- Набор состояний S содержит любой порядок букв вплоть до длины q. (Таким образом, размер S конечен.) Плюс одно состояние «больше слова».
- функция перехода состояния d, которая принимает букву и перемещается в состояние, соответствующее прочитанной части слова.
- F - это множество состояний, которые являются точными перестановками q.
Таким образом, можно создать автомат конечного состояния для принятия перестановок данного слова.
Идем дальше с доказательством
Итак, я доказал, что обычные языки способны проверять перестановки, не так ли?
Так почему нет подходов для достижения этого с помощью регулярных выражений? Это полезный функционал.
^(a()|a()|b()|c()){4}\2\3\4\5$
кажется, работает (см. Regex101.com/r/9URPpg/4/tests ).