2015-11-02 7 views
1

У меня есть это регулярное выражение шаблон, который я сделал сам (я нуб, хотя и сделал это через следующие учебные пособия):Regex Дополнительный матч

^([a-z0-9\p{Greek}].*)\s(Ε[0-9\p{Greek}]+|Θ)\s[\(]([a-z1-9\p{Greek}]+.*)[\)]\s-\s([a-z0-9\p{Greek}]+$) 

И я пытаюсь соответствовать следующие предложения:

PROGRAMMATISTIKES реализовать ИНТЕРНЕТ E2 (E.V.D.) - DIMITRIOY

ПРОГРАММИРОВАНИЕ 1 Th (AMF) - MASTOROKOSTAS

ВВЕДЕНИЕ В КОМПЬЮТЕР I (AMF) - VOLOGIANNIDIS

И так далее.

Этот шаблон разбивает строку на 4 части.

Например, для строки:

PROGRAMMATISTIKES реализации ИНТЕРНЕТ E2 (E.V.D.) - ДИМИТРИУ

Первый матч: PROGRAMMATISTIKES реализовать INTERNET (Имя субъекта)

Второй матч: E2 (класс)

Третий матч: EB (Номер)

И матч вперед является: ДИМИТРИУ (Учитель)


Сейчас в некоторых записях E*/Θ не определен, и я хочу, чтобы получить 3 матча без E*/Θ. Как изменить шаблон, чтобы (Ε[0-9\p{Greek}]+|Θ) был необязательным совпадением?

Я попытался ? до сих пор, а потому, что в моих предыдущих матчах я определяю \s и \s требует 2 пробельных, чтобы получить 3 матча и у меня есть только один в моей строке.

+0

Что не так с установкой '?' В '' (Ε [0-9 \ p {Greek}] + | Θ) 'group? Можете ли вы привести пример и объяснить, что ожидается? Посмотрите [это обновленное регулярное выражение] (https://regex101.com/r/rL6yA9/2). –

+0

по той же логике добавления токена '?' В вашу группу, добавьте '?' К вашим токенам '\ s', чтобы они были необязательными? –

ответ

2

Я думаю, что вам нужно сделать две вещи:

  • Сделать .* ленивым (т.е. .*?)
  • Заключите (?:\s(Ε[0-9\p{Greek}]+|Θ))? с не захватывая опциональной группы.

Регулярное выражение будет выглядеть

^([a-z0-9\p{Greek}].*?)(?:\s(Ε[0-9\p{Greek}]+|Θ))?\s[\(]([a-z1-9\p{Greek}]+.*)[\)]\s-\s([a-z0-9\p{Greek}]+)$ 
        ^^ ^^      ^

См demo

Если вы не сделать первый .* ленивый, он будет съедать вторую группу, которая является необязательной.Сделать это ленивым будет гарантировать, что если есть текст, который может быть сопоставлен второй группой захвата, он будет «установлен».

Обратите внимание, что вы звоните группы захватасоответствует, что не так. Матчи - это целые тексты, соответствующие всему регулярному выражению, а захваты - это подстроки, соответствующие частям регулярного выражения, заключенным в круглые скобки без привязки. См. Больше на capture groups at regular-expressions.info.

-2

Вы можете использовать что-то вроде:

(E[0-9\p{Greek}]+|0)? 

Вся группа будет факультативным (?).

+1

OP уже написал, что он не работает. –