Регулярное выражение для строк с четным числом а и нечетным числом б - PullRequest
14 голосов
/ 13 сентября 2010

У меня возникла проблема в решении проблемы: - Это задание, я решил его, но оно кажется слишком длинным и расплывчатым. Может ли кто-нибудь помочь мне, пожалуйста ......

Регулярное выражениедля строк с четным числом a и нечетным числом b, где набор символов = {a, b}.

Ответы [ 13 ]

19 голосов
/ 13 сентября 2010

Один из способов сделать это - пропустить его через два регулярных выражения, убедившись, что они совпадают (при условии, что вы хотите использовать регулярные выражения вообще, см. Альтернативу ниже):

^b*(ab*ab*)*$
^a*ba*(ba*ba*)*$

Все остальное (и, фактически, даже это), скорее всего, является просто попыткой проявить смекалку, что обычно является серьезным провалом.

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

Второе схоже, но гарантирует, что нечетное число b благодаряначиная с a*ba*.


Далеко лучший способ сделать это - полностью игнорировать регулярные выражения и просто пробежаться по строке следующим образом:

def isValid(s):
    set evenA to true
    set oddB to false
    for c as each character in s:
        if c is 'a':
            set evenA to not evenA
        else if c is 'b':
            set oddB to  not oddB
        else:
            return false
    return evenA and oddB

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


Для чего-то стоитОтвет gex:

(aa|bb|(ab|ba)(aa|bb)*(ba|ab))*(b|(ab|ba)(bb|aa)*a)

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

Это исходит отбумага от одного Грега Бэкона.См. здесь для фактической внутренней работы.

3 голосов
/ 09 сентября 2018
Even-Even = (aa+bb+(ab+ba)(aa+bb)*(ab+ba))*

(Четный-Четный имеет четное число Aas и b's оба)

Четные a и нечетные b = Четные-Четные b Четные-Четные

Это должно сработать

1 голос
/ 13 сентября 2010
  1. (bb)*a(aa)*ab(bb)*
  2. ab(bb)* a(aa)*
  3. b(aa)*(bb)* .
    .
    .
    .
    .
    ,

таких регулярных выражений может быть много. Есть ли у вас какие-либо другие условия, такие как «начинать с» или что-то в этом роде (кроме нечетного «b» и даже «a»)?

0 голосов
/ 02 февраля 2019

Структурированный способ сделать это состоит в том, чтобы создать одну диаграмму перехода и построить из нее регулярное выражение.Регулярное выражение в этом случае будет

(a((b(aa)*b)*a+b(aa)*ab)+b((a(bb)*a)*b+a(bb)*ba))b(a(bb)*a)*

Это выглядит сложным, но оно охватывает все возможные случаи, которые могут возникнуть.

0 голосов
/ 23 ноября 2018

Для четного числа а и b у нас есть регулярное выражение:

E = { (ab + ba) (aa+bb)* (ab+ba) }*

Для четного числа a и нечетного числа b все, что нам нужно сделать, этодобавьте дополнительный b в вышеприведенном выражении E.

Требуемое регулярное выражение будет:

E = { ((ab + ba) (aa+bb)* (ab+ba))* b ((ab + ba) (aa+bb)* (ab+ba))* }
0 голосов
/ 01 декабря 2017

Регулярные выражения приведены ниже:

    (aa|bb)*((ab|ba)(aa|bb)*(ab|ba)(aa|bb)*b)*
0 голосов
/ 10 октября 2017

Это регулярное выражение принимает все строки с четным числом a и четным числом b

r1=((ab+ba)(aa+bb)*(ab+ba)+(aa+bb))*

Теперь, чтобы получить регулярное выражение для четных а и нечетных б

r2=(b+a(aa+bb)*(ab+ba))((ab+ba)(aa+bb)*(ab+ba)+(aa+bb))*
0 голосов
/ 09 апреля 2017

Все строки, которые не имеют четных и нечетных чисел b (((aa + bb) * b (aa + bb) *) + (A + ((a + b) b (a + b)) *)) *

здесь A для пустой строки.А можно пренебречь.

, если есть какая-либо ошибка, пожалуйста, укажите это.

0 голосов
/ 18 декабря 2016

Если это четное число a, за которым следует нечетное число b (aa) * b (bb) * должно работать

, если оно в любом порядке (aa) * b (bb) * + b(bb) (аа) должно работать

0 голосов
/ 13 декабря 2016

Совет высокого уровня: создайте детерминированный конечный автомат для языка - очень просто, закодируйте четность числа a s и b s в состояниях, с q0, кодирующим даже nr a с и даже номер. b s, и переход соответственно ---, а затем преобразовать DFA в регулярное выражение (либо с помощью хорошо известных алгоритмов для этого, либо «с нуля»).

Идея состоит в том, чтобы использовать понятную эквивалентность между DFA (алгоритмическое описание регулярных языков) и регулярными выражениями (алгебраическое описание регулярных языков).

...