it-roy-ru.com

Кратчайшее регулярное выражение для двоичного числа с четным числом 0 с или нечетным числом 1 с

Напишите выражение, которое содержит четное число 0 или нечетное число 1

Я получил это до:

1*(01*01*)* + 0*10*(10*10*)*

где первая часть представляет собой четное число 0, а вторая часть - нечетное число 1

Однако должно быть упрощенное решение, которого я не вижу. Какие-нибудь советы?

23
user3085290

Часть нечетных 1: 0*1(0|10*1)*

Часть четных, зависит:

  1. Пустая строка верна: (1|01*0)*
  2. No-0s - четные-0s: (1|01*0)+
  3. Должно иметь как минимум два 0: 1*(01*01*)+ (как в OP)

старый ответ: исправить в случаях 1 и 2

(1*(01*0)*)+ | 0*1(0*(10*1)*)*

Слава @OGHaza за полезные комментарии.

18
Julián Urbano

Используя тот факт, что строки четной длины ВСЕГДА удовлетворяют вашим ограничениям:

^(([01]{2})*|1*(01*01*)*)$
11
Ruud Helderman

Определите «самый короткий». Если вы ищете самое короткое время оценки (то есть самое быстрое), убедитесь, что вы не используете группы захвата. 

вот пример в JavaScript

^(?:1*(?:01*0)*)+|0*1(?:0*(?:10*1)*)*$

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

^(1*(01*0)*)+|0*1(0*(10*1)*)*$
1
gillyspy

С наименьшим количеством символов, 

1*(01*01*)*
0
Moses Kirathe

Самое простое решение, которое я нашел:

1+0(0+1)((1+0)(1+0))*
0
Mehran