Нет, это не правильно.Например, ваше выражение не распознает строку aaccc
, потому что все ваши подвыражения требуют, чтобы ваши строки начинались с ccc
, что отличается от того, что будет указано в описании языка.
Некоторые выраженияверно, например, необходимость разделить части aa
, bb
и cc
.Вы немного злоупотребляете скобками, но это скорее вопрос вкуса, чем правильности.
Ваша базовая единица - (aUbUc)
, что соответствует ∑
.Строка должна содержать ccc
где-то в ней, поэтому давайте начнем с этого:
(aUbUc)*ccc(aUbUc)*
Это все строки, содержащие ccc
.Следующее требование является сложным: символы от третьего до последнего и второго от последнего должны быть одинаковыми.Это может совпадать с частью ccc
.Если этого не произойдет, этого будет достаточно:
(aUbUc)*ccc(aUbUc)*(aaUbbUcc)(aUbUc)
Но это не позволяет нам иметь строку типа accca
или aaccc
.Обратите внимание, однако, что он требует, чтобы все строки были по крайней мере длиной 6, поэтому он удовлетворяет требованию, чтобы длина строк была больше 5. Я собираюсь сокращать и использовать ∑
вместо (aUbUc)
, чтобы сделать этоменьше:
(∑*ccc∑*(aaUbbUcc)∑)U(∑∑∑∑*ccc)U(∑∑∑*ccc∑)
Обратите внимание на дополнительные ∑
s, которые требуются для дополнения других подвыражений, чтобы все пути имели длину строки больше 5.
Альтернативанепосредственно придумать регулярное выражение - это создать DFA, соответствующий этому языку, а затем преобразовать его в регулярное выражение .При создании DFA вы обнаружите аналогичные проблемы, например необходимость убедиться, что вы закрываете случай перекрытия, где ccc
находится в конце строки.Чтобы сделать это немного проще, вы можете начать с NFA, а затем преобразовать NFA в DFA.