2015-10-07 4 views
0

Учитывая следующие данныеКак бы написать регулярное выражение, которое соответствует

  1. "apple orange plum"
  2. "apple grape plum"

я буду иметь данный термин, который будет определять, если что-то совпадение.

например «яблоко оранжевый сливы груши вишня»

мне нужно написать регулярное выражение, которое будет соответствовать на [1], но не [2], потому что мой член не содержит «виноград»

Я не знаю, возможно ли это или нет с регулярными выражениями?

+0

Возможно. Какое ароматическое регулярное выражение вы используете? Что вы пробовали? – jmargolisvt

+0

Я играю с множеством вариаций на http://www.regexr.com/, на которые я потратил много времени, я не мог редактировать их, чтобы что-то соответствовало. – Matthew

+0

короткий ответ: да Можно с регулярными выражениями –

ответ

1

вы можете использовать

^(((apple|orange|plum|pear|chery)(?: |$))+)$ 

DEMO regex101

Объяснение

(apple|orange|plum|pear|chery) любое из этих слов

(?: |$)non capturing group

1

Языки, которые поддерживают lookaheads (JavaScript, PCRE, Ruby, Java, Python) может использовать их, чтобы проверить, содержит ли строка/строки эти значения, в любом порядке:

^(?=.*\b(item1)\b)(?=.*\b(item2)\b)(?=.*\b(item3)\b) 

Для вашего [1] данных, это становится:

^(?=.*\b(apple)\b)(?=.*\b(orange)\b)(?=.*\b(plum)\b) 

Вы можете увидеть это на regex101 here.

Для ваших [2.] данных, это становится:

^(?=.*\b(apple)\b)(?=.*\b(grape)\b)(?=.*\b(plum)\b) 

Вы можете увидеть это на regex101 here.

Вам, разумеется, не нужно иметь группы захвата ВНУТРИ взглядов. Вы могли бы просто соответствовать этим пунктам (без групп захвата), а затем использовать .* в конце шаблона в соответствии с начала строки до конца:

^(?=.*\bapple\b)(?=.*\borange\b)(?=.*\bplum\b).* 

Обратите внимание на regex101 однако, что вы больше не видите результатов в разделе ИНФОРМАЦИЯ ПО МАТЕРИАЛАМ (ничего не было зафиксировано), но вся строка была выбрана, когда совпадение было действительным.