Соответствие группе, которая может существовать или не существовать - PullRequest
9 голосов
/ 12 июля 2011

Мое регулярное выражение должно проанализировать адрес, который выглядит следующим образом:

BLOOKKOKATU 20 A 773 00810 HELSINKI SUOMI
-------------------- ----- -------- -----
          1            2       3      4*

Группы один, две и три всегда будут существовать в адресе. Группа 4 может не существовать. Я написал регулярное выражение, которое помогает мне получить первую, вторую и третью часть, но мне также понадобится четвертая часть. Часть 4 является названием страны и может быть либо FINLAND, либо SUOMI. Если четвертая часть не существует в адресе, четвертая группа будет пустой. Пока это моё регулярное выражение, но третья группа тоже захватывает страну. Любая помощь?

(.*?)\s(\d{5})\s(.*)$

(я собираюсь использовать эту функцию Oracle REGEXP)

Ответы [ 5 ]

12 голосов
/ 12 июля 2011

Измените регулярное выражение на:

(.*?)\s(\d{5})\s(.+?)\s?(FINLAND|SUOMI)?$

Если сделать группу три ни одной жадной, то вы сможете выбрать необязательный выбор пробел + страна.Если группа 4 не совпадает, я думаю, что она будет неинициализированной, а не пустой, это зависит от языка.

3 голосов
/ 27 апреля 2014

Чтобы сопоставить символ (или в вашей группе дел), который может существовать или не существовать, вам нужно использовать ? после рассматриваемого символа / подшаблона / класса.Я отвечаю сейчас, потому что RegEx сложен и должен быть объяснен: недостаточно только опубликовать исправление без ответа!

Знак вопроса соответствует нулю или одному из предшествующих символов, классов илиподшаблон.Думайте об этом как «предыдущий пункт не является обязательным».Например, colou? R соответствует как цвету, так и цвету, потому что "u" является необязательным.

Выше цитата из http://www.autohotkey.com/docs/misc/RegEx-QuickRef.htm

2 голосов
/ 12 июля 2011

Попробуйте это:

(.*?)\s(\d{5})\s(.*?)\s?([^\s]*)?$
0 голосов
/ 12 июля 2011

(.*?)\s(\d{5})\s(\w+)\s(\w*)

Пример:

   SQL> with t as
      2  ( select 'BLOOKKOKATU 20 A 773 00810 HELSINKI SUOMI' text from dual
      3  )
      4  select text
      5       , regexp_replace(text,'(.*?)\s(\d{5})\s(\w+)\s(\w*)','\1**\2**\3**\4') new_text
      6    from t
      7  /


TEXT
-----------------------------------------
NEW_TEXT
-----------------------------------------------------------------------------------------
BLOOKKOKATU 20 A 773 00810 HELSINKI SUOMI
BLOOKKOKATU 20 A 773**00810**HELSINKI**SUOMI


1 row selected.

С уважением,
Роб.

0 голосов
/ 12 июля 2011

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

(\w+\s\d+\s\w\s\d+)\s(\d+)\s(\w+)\s(\w*)

или если пробел в порядке вместо "пробела":

(\w+ \d+ \w \d+) (\d+) (\w+) (\w*)
  • Группа 1: BLOOKKOKATU 20 A 773
  • Группа 2: 00810
  • Группа 3: HELSINKI
  • Группа 4: SUOMI (опция - не должна совпадать)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...