как описать это регулярное выражение на английском языке

Я пытаюсь описать регулярное выражение на английском здесь,

и допустим у нас есть для (b(bb)*)*

вы бы сказали: zero or more b's

или мы можем иметь (a(aa)*b(bb)*)*

вы бы сказали: odd number of a's that end in odd number of b's

теперь мой вопрос о ((a+b)a)*

вы бы сказали: words of even length where every even letter is an 'a'

откуда четная длина??? как они получили, что каждая четная буква является «а»? это от нуля, потому что ноль - четное число?


person Ris    schedule 01.03.2014    source источник
comment
Это не соответствует только словам четной длины, рассмотрим aba или aaaba   -  person megawac    schedule 01.03.2014
comment
Не знаю, откуда вы берете эти описания, но они неверны. (b(bb)*)* соответствует нулю или нечетному количеству b. (a(aa)*b(bb)*)* соответствует тому, что вы описали, но также и пустой строке. ((a+b)a)* не требует, чтобы слово было четной длины или чтобы каждая четная буква была a. foo и fooaaba также совпадают.   -  person elixenide    schedule 01.03.2014
comment
Откуда такие описания? Они кажутся не очень точными.   -  person Gorkk    schedule 01.03.2014
comment
Разве (b(bb)*)* не может соответствовать четному количеству букв b?   -  person pandubear    schedule 01.03.2014
comment
@EdCottrell спасибо, что поправили меня, это именно то, что я написал, и меня неправильно пометили за использование «нечетного»!   -  person Ris    schedule 01.03.2014
comment
@pandubear Да: допустимы, начиная с нуля: , b, bbb, bbbb (bbb с первой итерации, b со второй), ...   -  person aliteralmind    schedule 01.03.2014
comment
@Ris Я бы порекомендовал вам использовать такой инструмент, как debuggex.com, чтобы протестировать эти регулярные выражения. (Не мой инструмент, никакой принадлежности; мне просто нравится.) Описания выше не годятся. Извините, что вас пометили за хороший ответ!   -  person elixenide    schedule 01.03.2014
comment
@EdCottrell спасибо .. это очень полезно .. я никогда не слышал об этом   -  person Ris    schedule 01.03.2014
comment
@pandubear Вы правы, (b(bb)*)* может соответствовать четному числу. Я ошибся в этом. Ой!   -  person elixenide    schedule 01.03.2014
comment
(b(bb)*)* практически совпадает с b*   -  person justhalf    schedule 01.03.2014


Ответы (3)


((a+b)a)*

"вы бы сказали: слова четной длины, в которых каждая четная буква — "а""

Это не правильное описание. Более точными были бы «слова, в которых есть по крайней мере один a, за которым следует ровно один b, за которым следует ровно один a, ноль или более раз "

(+ означает «один или несколько», * означает «ноль или более».)

Это больше о as и bs туда и обратно - между bs может быть миллион as, но никогда не бывает двух bs рядом друг с другом.

И обратите внимание, что внутренние скобки не нужны. Другими словами, это эквивалентно:

(a+ba)*

Свободное пространство:

(a+     //"a", one or more times
 b      //followed by exactly one "b"
 a      //followed by exactly one "a"
)*      //zero or more times
person aliteralmind    schedule 01.03.2014
comment
Извините, а как вы туда попали? извините, я новичок в этом ... разве это не говорит a или b ? - person Ris; 01.03.2014
comment
неважно, что вы отредактировали ответ ... теперь я наконец получил его ... большое спасибо, что нашли время - person Ris; 01.03.2014
comment
Превосходно. Рад помочь, и спасибо за голосование и принятие. - person aliteralmind; 01.03.2014
comment
Глядя на комментарий к ответу судьи Менталя, этот ответ неверен, поскольку знак + следует интерпретировать как или, как это обычно делается на уроках формального языка. - person justhalf; 01.03.2014

Ваше описание будет точным только в том случае, если вы интерпретируете выражение a+b как a или b. Большинство инструментов для работы с регулярными выражениями записывают это с помощью вертикальной черты, например a|b. Другие комментаторы и ответчики интерпретировали + как постфиксный оператор, означающий «один или несколько».

Используя это чтение, причина, по которой каждая строка в этом наборе должна быть четной длины, заключается в том, что повторение выходит за пределы строки длины 2. Это означает «ноль или более копий либо aa, либо ba». Ясно, что каждое слово, соответствующее этому описанию, имеет четную длину. 0 четен по определению, и каждая вторая буква должна быть a.

{ ¢, аа, ба, аааа, ааба, бааа, баба, ...}

person Judge Mental    schedule 01.03.2014
comment
Я интерпретировал выражение a+b как a или b - person Ris; 01.03.2014
comment
Если вы считаете, что + является или (что, я полагаю, так и есть, поскольку я подозреваю, что вы проводите урок на формальном языке), то это должен быть правильный ответ, вы должны изменить свой принятый ответ. И описания, которые вы даете, все правильные, кроме второго, где следует добавить, что описанная вами строка может повторяться 0 или более раз. - person justhalf; 01.03.2014

ОП, ваш вопрос основан на учебной программе из лекции и текста, где + предназначен для операции ИЛИ. Текст и лекционный материал очень ясно дают понять, что означает обозначение...

(b(bb)*)* = 0-n b, за которыми следуют 0-n bb. другими словами, ноль или более b.

(a(aa)*b(bb)*)* соответствует шаблону 2n + 1 a, за которым следует 2n + 1 b, если это не пустая строка.

((a+b)a)* является более двусмысленным, т. е. о нем можно было бы сказать больше, чем об ответе, но ответ также нельзя назвать неправильным. Это все слова четной длины, состоящие из всех «а» или «а» и «б». Я предполагаю, что этот ответ получил бы частичную оценку и полную оценку за включение части о том, что это четная буква.

person kjp    schedule 28.01.2018