2015-06-05 7 views
2

В основном я хочу регулярное выражение, чтобы соответствовать этим условиямRegex чтобы соответствовать определенным условиям

  1. Первых 8 символов должны быть в пределах [A-Za-Z]
  2. Вслед за любым количеством цифр
  3. Вслед за любым словом характер, но не сразу folowed на «или» или «и»

I ток есть это регулярное выражение:

^(?i:([a-z]{1,8})(\d+)((?!or|and).)+)$ 

это прекрасно работает на следующем примере:

  • ABCDEFGH ZZZ
  • GFEDCBAH ZZZ99

но НЕ с этим, потому что я думаю, если удовлетворяют условию "ИЛИ" в "FORALL":

  • WOLRDWAR FORALL

Ожидаемый результат:

AAAAAAAA100NANDROID - should match 
AAAAAAAA100ANDROID - should not match 
AAAAAAAA100OR - should not match 
AAAAAAAA100AND - should not match 

В принципе, я не хочу, чтобы FOR соответствовало OR, любое решение для моей проблемы? Кстати, это Рубите

+0

Define "а затем". Вы имеете в виду «конец с»? Ограничено пробелами? Другие? –

+0

Я имею в виду точно, я отредактировал, чтобы сделать его более ясным, спасибо :) – Rowel

ответ

1

Проблема с @anubhava регулярных выражений и других, подобных ей, что
его слишком либеральным использованием .* после утверждения.

Это означает, что он может разделить выражение перед тем утверждение затем
забрать ее с другой стороны.

Например ^(?i:([a-z]{8})(\d+)((?!or|and).*))$ легко соответствует AAAAAAAA100AND

Это редкий случай, который заставляет двигатель отступиться цифру, чтобы удовлетворить утверждение.
Обычно, если .* не использовались, было бы необязательно беспокоиться.

Это можно исправить, вставив в утверждение конструкцию \d*.
Имейте в виду, что утверждения являются самостоятельными, они будут соответствовать первым, а затем проверять, не будет ли он вторым. Но это не мешает двигателю отступать, если это возможно.

^(?i:([a-z]{8})(\d+)((?!\d*(?:or|and)).*))$

Expanded:

^
(?i: 
     ([a-z]{8})     # (1) 
     (\d+)      # (2) 

     (       # (3 start) 
      (?! 
       \d* 
       (?: or | and) 
      ) 
      .* 
    )        # (3 end) 
) 
$ 
+0

Действительно, вы правы, измените ли вы свое решение с моим решением этой проблемы? '^ (? i: ([a-z] {8}) (\ d +) ((?! (?: или | и)) \ D. *)) $' – Rowel

+0

Не уверен. Это выглядит нормально, но я думаю, что мой путь лучше, если вы ожидаете, что в конце появятся дополнительные слова. – sln

1

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

/^(?i:([a-z]{8})(\d+)((?!or|and).*))$/ 

RegEx Demo

+0

В принципе я хочу WORLDWAR2 ** FOR ** ВСЕ, чтобы быть совпадением, но не WORLDWAR2 ** ИЛИ ** ВСЕ – Rowel

+0

ok проверить обновленное regex и новое демо – anubhava

1

Я думаю, что вы ищете для этого (я использую положительный взгляд-за (?<=\d) так что мы только исключить or или and, которым предшествует цифра):

^(?i:([a-z]{1,8})(\d+)((?!(?<=\d)(?:or|and)).)+)$ 

См demo

1

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

^(?i:[a-z]{8}\d+(?!or|and).*)$ 

Rubular Demo

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