2013-11-29 10 views
2

Я должен создать регулярное выражение над алфавитом {A, B, ... Z}, который содержит по крайней мере один D, и где должны выполняться каждое вхождение OO (не обязательно сразу) с помощью L. Так что линии нравится:Regex Of String, который должен содержать определенные буквы

нЕ FEED МЕДВЕДЬ

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

То, что я до сих пор:

(?=[A-CE-Z]*D)(.*?OO(?=[A-KM-Z]*L) 

Любая помощь будет удивительным!

Спасибо!

+2

Если у вас были трудности, у вас должно быть хотя бы несколько примеров того, что вы пробовали, чтобы вы могли сюда включить. Пожалуйста, отредактируйте свой вопрос и сообщите об этом.Не делая этого, это, кажется, вопрос домашней работы. Благодарю. –

ответ

3

Вы можете попробовать это опережения регулярное выражение на основе:

^(?=[ A-CE-Z]*D)(.*?OO(?=[^L]*L)|(?!.*?OO)[A-Z ])*$ 

Объяснение:

  • (?=[ A-CE-Z]*D) --- Делает, что существует, по крайней мере D на входе
  • (.*?OO(?=[^L]*L)|(?!.*?OO).) --- смотри ниже
    • .*?OO(?=[^L]*L) --- Если OO есть, то оно должно следовать по крайней мере L
    • (?!.*?OO). --- там нет OO

enter image description here

+3

+1. Хотя я бы сменил '[^ D]' на '[A-CE-Z]', так как предполагается, что регулярное выражение будет превышать '{A, B, ..., Z}'. – justhalf

+0

@RakeshKR: Спасибо, что добавили это хорошее изображение регулярных выражений. – anubhava

+0

-1 Я не часто сбрасываю сущность исключительно на основе реализации, но для этого ответа я делаю исключение: это ужасно. Он может * работать *, но примерно в 3 раза дольше, чем нужно. – Bohemian

0

Закрепленные взгляд aheads являются путь:

^(?=.*D)(?!.*OO[^L]*$)[A-Z ]*$ 

Обратите внимание, что вам не нужен класс символов [A-CE-Z]; .* все в порядке (подумайте об этом, и вы должны понять, почему).

См. live demo этого регулярного выражения.

+1

Как насчет того, что он не хочет сказать '{~ /; , , < >() '? Это просто неправильно. –

+1

Повторите попытку. oo необязательно – anubhava

+0

@anubhava oops! Пропустил это (исправлено сейчас). Тем не менее, посмотрите, как это не должно быть так долго. – Bohemian

0

Я хотел бы отделить условия в своих группах, как так

^(?!.*[^\sA-Z])(?=.*D)((?=.*OO.*L)|(?!.*OO)).*$

  • (?!.*[^\sA-Z]) не видит ничего, кроме алфавита и пробелы
  • (?=.*D) содержит по крайней мере один «D»
  • ((?=.*OO.*L)|(?!.*OO)) Если в нем содержится «ОО», за ним следует «L» или не отображается «OO»
  • .* grab все проходит все условия
Смежные вопросы