регулярное выражение для всех двоичных строк, которые включают как минимум два 0 и хотя бы один 1? - PullRequest
0 голосов
/ 20 октября 2011

Я думаю, что это будет (E0 * 0 * EUE1 * E)? где E - набор моего алфавита, по крайней мере с 2 0 и по крайней мере 1 1

Ответы [ 4 ]

2 голосов
/ 20 октября 2011

Попробуйте это выражение:

^(.*0.*0.*1.*)|(.*0.*1.*0.*)|(.*1.*0.*0.*)$

EDIT Можно упростить до:

^.*(0.*0.*1)|(0.*1.*0)|(1.*0.*0).*$
1 голос
/ 20 октября 2011

Если вам разрешено использовать прогнозирование, вот как я это сделаю: (в режиме свободного пробела PHP с комментариями.)

$re = '/
    # Binary strings that include at least two 0s and at least one 1.
    ^                  # Anchor to start of string.
    (?=(?:[^0]*0){2})  # at least two 0s. 
    (?=[^1]*1)         # at least one 1.
    [+\-]?             # Optional leading sign.
    [01]+              # Match string of binary digits.
    $                  # Anchor to end of string.
    /x';

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

0 голосов
/ 20 октября 2011

(. * 00 +. 1 +. ) | (. * 1+. * 00 +. *)

Вышесказанное самоочевидно

.любой символ + один или несколько

0 голосов
/ 20 октября 2011

Предложенное решение неверно, так как оно также примет 000000000, где E = {0,1}.обратите внимание, что 1 * означает, что любое число 1 [включая ни одного]

E* * (0E*0E*1+0E*1E*0+1E*0E*0) * E* будет работать: все возможные перестановки 0,0,1, и вставьте E *, где это возможно [так что вы можете вставить любое количество символовмежду / до обязательных элементов.В синтаксисе регулярных выражений это: .*(0.*0.*1|0.*1.*0|1.*0.*0).*

...