REGEXP_REPLACE для точного шаблона регулярных выражений, не работает - PullRequest
2 голосов
/ 12 июня 2019

Я пытаюсь сопоставить точный шаблон, чтобы выполнить некоторую очистку данных для ISSN, используя приведенный ниже код:

select case when REGEXP_REPLACE('1234-5678 ÿþT(zlsd?k+j''fh{l}x[a]j).,~!@#$%^&*()_+{}|:<>?`"\;''/-',  '([0-9]{4}[\-]?[Xx0-9]{4})(.*)', '$1') not similar to '[0-9]{4}[\-]?[Xx0-9]{4}' then 'NOT' else 'YES' end

Шаблон, который я хочу, соответствует любой 8-значной группе с возможной чертой в середине ивозможно X в конце.

Приведенный выше код работает в большинстве случаев, но если в следующем примере используется группа захвата 1: 123456789, то он также возвращает положительное значение, поскольку он соответствует первым 8 цифрам, и я неЯ не хочу этого.

Я пытался окружить группу захвата 1 с помощью ^...$, но это тоже не работает.

Так что я хотел бы точно подобрать эти примеры и похожие:

1234-5678 
1234-567X 
12345678 
1234567X

НО ЭТО (и тому подобное):

1234567899
1234567899x

Чего мне не хватает?

1 Ответ

4 голосов
/ 12 июня 2019

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

^([0-9]{4}-?[Xx0-9]{4})([^0-9].*)?$

См. Демоверсию regex

Детали

  • ^ - начало строки
  • ([0-9]{4}-?[Xx0-9]{4}) - Группа захвата 1 ($1): четыре цифры, необязательный -, а затем четыре x / X или цифры
  • ([^0-9].*)? - необязательная группа захвата 2: любой символ, кроме цифры, а затем любые 0+ символов как можно больше
  • $ - конец строки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...