2013-11-11 3 views
3

Я пытаюсь проверить, действительно ли уровень или нет. Уровень имеет вид: (но они больше из них 998)2 цифры разрешены только один раз (Regex)

bbbbbbb 
b41111b 
b81400b 
b81010b 
b01121b 
b08001b 
bbbbbbb 

Уровень должен следовать нескольким правилам. Я написал регулярное выражение для соответствия всем правилам, кроме одного: Уровень должен содержать ровно 1 раз 2 и 1 раз 4. (Обратите внимание, что на уровне выше есть два 4 и один 2. Недопустимый уровень выше.)

Это школьный проект, поэтому, пожалуйста, направьте меня на ответ. Спасибо заранее.

EDIT:

Мой текущий регулярное выражение:

^b{' + str(length) + r'}\n(b{1}[0-8]{' + str(length - 2) + r'}b{1}\n)+b{' + str(length) + '}$ 

Для приведенного выше уровня, длина = 7 Обратите внимание, что он даже не пытается фильтровать этот неправильный уровень выше. Другие правила:

  1. Уровень должен быть окружен «Ъ»
  2. Уровень может содержать только символ «B» и число меньше 9.
  3. Там может быть только один 2
  4. Там может быть только один 4

Моя регулярное выражение выше действительно принимает правила 1 и 2 во внимание, но мне еще нужно выяснить правила 3 ​​и 4.

Я пробовал искать и так, не мог понять.

ответ

0

Это регулярное выражение, которое будет соответствовать всем вашим условиям:

^b(?!(?:[^2]*2){2,})(?!(?:[^4]*4){2,})[b0-8]*b$ 
  • Она начинается и заканчивается с помощью б ^b и $b
  • Он содержит только буквы Ь и числа 0-8 по [b0-8]*
  • Это не позволит более чем одну цифру 2, используя (?!(?:[^2]*2){2,})
  • Это не позволит более одной цифры 4 с помощью (?!(?:[^4]*4){2,})
+0

'bbbbbbbbbbbbbbb b0000000000000b b0233333303400b b0111111111110b b0000000000000b bbbbbbbbbbbbbbb' действительный уровень, но ваше регулярное выражение не захватить его. – Auberon

+0

Неправильно. Мое регулярное выражение захватывает всех из них, см. ** live demo: http://www.rubular.com/r/1cOFdbuP5k** – anubhava

+0

Я должен был упомянуть. Я работаю на Python, это имеет значение? – Auberon

0

Ну, регулярное выражение для ровно 1 a будет [^a]*a[^a]* (то есть, возможно, пустая последовательность, не являющиеся a-х, с последующей а, а затем, возможно, пустой последовательностью, не являющихся a-х). Я оставлю это упражнение, как обрабатывать несколько строк &, убедившись, что это охватывает весь уровень.

Для точно 1 a и 1 b: [^ab]*((a[^ab]*b)|(b[^ab]*a))[^ab]*, с такими же оговорками. Объяснение: последовательность не-или-b, следуйте EITHER 1) a, пробег не-a-or-b и ab или 2) ab, запуск не-a-or-b , и a, с THAT, за которым следует пробег не-или-b.

+0

Я пробовал и думал об этом. Но проблема в том, что мне нужно сделать это для 2-х символов (2 и 4), что усложняет ситуацию. – Auberon

0

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

Неясно, что вы пытаетесь соответствовать, так что я буду просто использовать заполнитель <your-regex> для текущего регулярного выражения:

^(?!.*?2.*?2)(?!.*?4.*?4)<your-regex> 

См live demo из rhis правильно отвергнув более чем на 1 «2».

+0

Я пытаюсь понять это. Не могли бы вы объяснить, что это будет делать? Я понимаю простые негативные взгляды, но это выглядит довольно сложно. – Auberon

+0

Говорят, что не может быть больше 1 "2" (то же самое для "4"). Обратите внимание, как это регулярное выражение намного проще, чем взгляд на принятый ответ. Это потому, что он использует * неохотные * квантификаторы '*?', Которые будут потреблять как можно меньше информации для соответствия - поэтому '. *' Не будет пропускать «2», что нарушит намерение (в отличие от * жадные * кванторы '*', который не будет работать) – Bohemian

Смежные вопросы