что такое регулярное выражение, не сгенерированное в {a, b}? - PullRequest
0 голосов
/ 21 апреля 2010

Я действительно застрял с этими 2 вопросами в течение более 2 дней. Я пытаюсь понять, что означает вопрос. Моего наставника тоже нет в городе.

Вопрос 1. Напишите регулярное выражение для единственных строк, которые не генерируются в {a, b} выражением: (a+b)****a(a+b)****. Объясните свои рассуждения.

И я попробовал второй вопрос. Как вы думаете, есть ли лучший ответ, чем этот?

Что такое регулярное выражение для набора строк, содержащих нечетное число a с или ровно два b с (a((a|b)(a|b))****|bb) Я знаю, что оно представляет любую нечетную длину a, RE равно a((a|b)(a|b))****

Ответы [ 5 ]

1 голос
/ 21 апреля 2010

Для совпадения с двумя a вы бы использовали что-то вроде aa, верно? Теперь мы знаем, что + - это квантификатор для 1 или более, а * - это квантификатор для 0 или более. Поэтому, если мы хотим повторить весь этот шаблон, мы можем поместить его в группу и повторить весь шаблон следующим образом: (aa)+.

Это будет соответствовать:

  • aa
  • aaaa

Но не:

  • a (потому что aa требует как минимум 2 элемента) `
  • aaa (потому что aa будет соответствовать первым двум, но у вас будет дополнительный a)

И если мы хотим сделать это нечетное четным, мы можем просто добавить еще один a вне группы следующим образом: a(aa)+. Однако, поскольку мы хотели получить нечетное количество без определенного минимума, мы не должны использовать +, поскольку для этого потребуется не менее 3 a.

Таким образом, весь ответ будет: (bb|a(aa)*)

1 голос
/ 21 апреля 2010

Вот начало первого вопроса. Сначала рассмотрим строки, которые генерирует это регулярное выражение:

(a+b)*a(a+b)*
  • Должно начинаться с a И
  • Каждый b должен иметь хотя бы один a непосредственно перед ним И
  • Должен быть либо aab, либо строка должна заканчиваться a.

Обратное это:

  • Не должно начинаться с a ИЛИ
  • Существует не менее одного b, а не a ИЛИ
  • Строка состоит только из повторений ab.

По второму вопросу вы должны проверить, правильно ли вы поняли вопрос. Ваша интерпретация выглядит так:

Каково регулярное выражение для набора строк, которые содержат либо (нечетное число a и любое количество b), либо (ровно два b и no a ).

Но другая интерпретация такова:

Каково регулярное выражение для набора строк, которые содержат либо (нечетное число a и любое количество b), либо (ровно два b и любое число a ).

0 голосов
/ 02 мая 2010

Это выражение означает, что RE должно содержать Atleast 1 'A' в выражении.

это выражение не принимать

'б' «Б» * или же Пустой набор

0 голосов
/ 21 апреля 2010

Выражение (a+b)*a(a+b)* просто означает: там имеет , чтобы быть a внутри строки.Это выражение может генерировать только следующие строки: b*

0 голосов
/ 21 апреля 2010

Похоже, первый вопрос просит вас написать регулярное выражение для набора строк, которые не соответствуют предоставленному регулярному выражению.

Например, предположим, что вопрос требовал регулярного выражения для набора строк , а не , соответствующего aa+ над {a}. Ну, вот несколько подходящих строк:

  • 'аа'
  • аааа '
  • ааааа '

Какие строки не совпадают? Вот только два:

  • ''
  • 'а'

Регулярное выражение для последнего набора: a?.

Что касается второго вопроса, я бы предложил создать несколько положительных и отрицательных тестовых случаев. Запустите несколько таких строк через регулярное выражение и посмотрите, что произойдет:

  • 'a' (должно пройти)
  • 'ааа' (должен пройти)
  • 'bb' (должно пройти)
  • '' (должен потерпеть неудачу)
  • 'аа' (должен потерпеть неудачу)
  • 'аба' (должен потерпеть неудачу)

Удачи!

...