REGEX исключить первый тире

Я пытаюсь использовать функции REGEXP_MATCH, REGEXP_EXTRACT в таблице, чтобы изолировать «назначенный порт» от набора данных.

У меня ужасное время с записями, у которых есть ведущий '-', я пробовал следующее, и лучшее, что я могу получить, это 4-значные цифры с ведущим "-", которые мне не нужны. Я хочу, чтобы он возвращал цифру-цифру с таким количеством цифр, которое соответствует этим критериям.

первое решение:

(\d*-\d*)*

второе решение:

(\d*-(\d*-\d*-\d*-\d*))

третье решение (возвращается только в формате '1-1-1-1', соответствует как -1-1-1-1):

([0-9]{0,3}-[0-9]{0,3}-[0-9]{0,3}-[0-9]{0,3}-[0-9]{0,3})

Пример данных:

NETWORK-1-1-1-1
ACCESS-1-1-1-1
FA0/1
GE-0/2/3
XE-2/1/10
GI0/0/1
GIGABIT ETHERNET 1-1-2
1-1-2-100
1-1-2-10.943

Желаемая изоляция (выделено жирным шрифтом)


СЕТЬ- 1-1-1-1
ДОСТУП- 1-1-1-1
FA0 / 1
GE-0 / 2/3
XE-2/1/10
GI0 / 0/1
GIGABIT ETHERNET 1-1-2
1-1-2 -100
1-1-2-10 .943

Желаемый возврат

1-1-1-1
1-1-1-1
excluded
excluded
excluded
excluded
1-1-2
1-1-2-100
1-1-2-10

Формула таблицы с совпадением и извлечением Regex:

IF REGEXP_MATCH([Port Access Less VLAN],'(\d{0,3}\/\d{0,3}\/\d{0,3})')
THEN REGEXP_EXTRACT([Port Access Less VLAN],'(\d{0,3}\/\d{0,3}\/\d{0,3})')

ELSEIF REGEXP_MATCH([Port Access Less VLAN],'(\d{0,3}\/\d{0,3})')
THEN REGEXP_EXTRACT([Port Access Less VLAN],'(\d{0,3}\/\d{0,3})')

ELSEIF REGEXP_MATCH([Port Access Less VLAN],'([0-9]{0,3}-[0-9]{0,3}-[0-9]{0,3}-[0-9]{0,3}-[0-9]{0,3})')
THEN REGEXP_EXTRACT([Port Access Less VLAN],'([0-9]{0,3}-[0-9]{0,3}-[0-9]{0,3}-[0-9]{0,3}-[0-9]{0,3})')

ELSE NULL
END

Таблица результатов:

1-1-1-1
1-1-1-1
0/1
0/2/3
2/1/10
0/0/1
1-1-2
1-1-2-100
1-1-2-10

person Jake Porter    schedule 16.01.2018    source источник
comment
Попробуйте (\d+(?:-\d+)+)   -  person Wiktor Stribiżew    schedule 17.01.2018
comment
это 100% сработало на regex101, но сломалось и не удалось в таблице. Огромный прогресс, так что спасибо   -  person Jake Porter    schedule 17.01.2018
comment
Хорошо, тогда попробуйте (\d+(-\d+)+) или (\d+-\b[-0-9]+\b)   -  person Wiktor Stribiżew    schedule 17.01.2018
comment
первый сделал это. Ты волшебник !!!   -  person Jake Porter    schedule 17.01.2018


Ответы (2)


Вы должны использовать {1,3} вместо {0,3}.

person Jos    schedule 16.01.2018
comment
([0-9] {0,3} - [0-9] {0,3} - [0-9] {0,3} - [0-9] {0,3} - [0-9] {0,3}) изменен на ([0-9] {1,3} - [0-9] {1,3} - [0-9] {1,3} - [0-9] {1, 3} - [0-9] {1,3}) возвращает -1-1-1 вместо -1-1-1-3 - person Jake Porter; 17.01.2018

получил решение через DM от Виктора, прекрасно работает

(\d+(-\d+)+)

предыдущий код

IF REGEXP_MATCH([Port Access Less VLAN],'(\d{0,3}\/\d{0,3}\/\d{0,3})')
THEN REGEXP_EXTRACT([Port Access Less VLAN],'(\d{0,3}\/\d{0,3}\/\d{0,3})')

ELSEIF REGEXP_MATCH([Port Access Less VLAN],'(\d{0,3}\/\d{0,3})')
THEN REGEXP_EXTRACT([Port Access Less VLAN],'(\d{0,3}\/\d{0,3})')


ELSEIF REGEXP_MATCH([Port Access Less VLAN],'([0-9]{0,3}-[0-9]{0,3}-[0-9]{0,3}-[0-9]{0,3}-[0-9]{0,3})')
THEN REGEXP_EXTRACT([Port Access Less VLAN],'([0-9]{0,3}-[0-9]{0,3}-[0-9]{0,3}-[0-9]{0,3}-[0-9]{0,3})')

ELSEIF REGEXP_MATCH([Port Access Less VLAN],'([0-9]{0,3}-[0-9]{0,3}-[0-9]{0,3}-[0-9]{0,3})')
THEN REGEXP_EXTRACT([Port Access Less VLAN],'([0-9]{0,3}-[0-9]{0,3}-[0-9]{0,3}-[0-9]{0,3})')

ELSEIF REGEXP_MATCH([Port Access Less VLAN],'([0-9]{0,3}-[0-9]{0,3}-[0-9]{0,3})')
THEN REGEXP_EXTRACT([Port Access Less VLAN],'([0-9]{0,3}-[0-9]{0,3}-[0-9]{0,3})')

ELSEIF REGEXP_MATCH([Port Access Less VLAN],'([0-9]{0,3}-[0-9]{0,3})')
THEN REGEXP_EXTRACT([Port Access Less VLAN],'([0-9]{0,3}-[0-9]{0,3})')

ELSEIF REGEXP_MATCH([Port Access Less VLAN],'(-[0-9]{0,3})')
THEN REGEXP_EXTRACT([Port Access Less VLAN],'(-[0-9]{0,3})')

ELSE NULL
END

Новый Улучшенный и РАБОЧИЙ код

IF REGEXP_MATCH([Port Access Less VLAN],'(\d+(\/\d+)+)')
THEN REGEXP_EXTRACT([Port Access Less VLAN],'(\d+(\/\d+)+)')

ELSEIF REGEXP_MATCH([Port Access Less VLAN],'(\d+(-\d+)+)')
THEN REGEXP_EXTRACT([Port Access Less VLAN],'(\d+(-\d+)+)')

ELSE NULL
END
person Jake Porter    schedule 16.01.2018