Проблема
Я пытаюсь создать регулярное выражение, в котором мы можем проверить, присутствуют ли все буквы в каком-либо наборе ссылок в некоторой другой строке, но только в нечетных числах (1, 3, 5,...).
Вот (очень) грубое изображение DFA, представляющий проблему:
Мое (разбитое) решение
Я начал использовать конечный набор {a, b}
, поэтому, по существу, проверил бы "есть ли нечетное число a
и нечетное число b
в строке?"
К сожалению, я не ушел слишком далеко. Я впервые прочитал этот поток, который очень похож на эту концепцию, но не смог получить ответ от (aa|bb|(ab|ba)(aa|bb)*(ba|ab))*(b|(ab|ba)(bb|aa)*a)
. (Я понимаю, как это работает, но не как преобразовать его для проверки нечетных чисел для обоих элементов.)
Вот что я до сих пор придумал: ^((ab|ba)(bb|aa)?|(bb|aa)?(ab|ba))+$
. Это в основном проверяет, есть ли ab
или ba
, за которым следует bb
или aa
или ничего, что приведет к ab
, ba
, abaa
, abbb
, baaa
или babb
. (Это также делает обратное этому, сначала проверяя двойную букву.) Это может повториться, неопределенно. У меня проблема: я не могу настроить ее, чтобы она соответствовала строке bbaaba
без соответствия bbaa
.
Кроме того, описанный выше метод не может динамически корректироваться для учета {a, b, c}
, например, хотя я готов отказаться от этого, чтобы решить начальную проблему.
Тестирование
Вот мои тестовые строки и желаемый результат, с указанием причин в скобках:
"ba" # True (1a, 1b)
"abbb" # True (1a, 3b)
"bbba" # True (1a, 3b)
"bbab" # True (1a, 3b)
"ababab" # True (3a, 3b)
"bbaaba" # True (3a, 3b)
"abb" # False (2b)
"aabb" # False (2a, 2b)
"aabba" # False (2b)
"" # False (0a, 0b is "even")
"a" # False (0b is "even")
"b" # False (0a is "even")
Вопрос
Итак, возможно ли это с помощью регулярного выражения? Или регулярные выражения более ограничены, чем DFA? Я знаю, что это можно сделать через базовый цикл, но это не то, что я собираюсь сделать.