Регулярное выражение Postgres regexp_split_to_array - PullRequest
0 голосов
/ 25 января 2012

В postgresql мне нужно извлечь 3 конкретных буквенно-цифровых символа из поля для данного столбца, а затем создать из него год. Поэтому, если значение поля равно FUT,GRA,S12,1055559 или S11,1050830,PON, мне нужно S11 или S12, а затем создать 2011 или 2012. Результат может оставаться текстовым полем.

Я использовал следующее, чтобы получить S??: substring(my_field from E'(S\\d\\d),') но создание года кажется более сложным. Я надеялся использовать regexp_split_to_array, но, похоже, он работает не очень хорошо.

Ответы [ 2 ]

2 голосов
/ 25 января 2012

Ты выглядишь, как будто ты почти там - тебе просто нужно добавить '20' к извлеченным '12' / '11':

ОБНОВЛЕНО (PostgreSQL не имеет границ \b (?!)):

SELECT '20'||substring(my_field from E'(?:^|\\W)S(\\d\\d)(?!\\w)') ....

-- NOTE: Old version. However there's no '\b' in this regex flavour.
SELECT '20'||substring(my_field from E'\\bS(\\d\\d)\\b') ....

Вы должны дважды убежать от обратной косой черты. Кроме того, использование скобок в регулярном выражении означает, что выбранная подстрока будет иметь значение «12» или «11», не включая «S». '20'||xxxx просто объединяет две строки.

(?:^|\\W) удостоверяется, что Sxx находится либо в начале строки, либо перед ней стоит не состоящий из слов символ (например, пробел или запятая). Это предотвращает сопоставление S13 in FUT,GRAS13,S12.

(?!\\w) гарантирует, что Sxx не сопровождается другим символом слова (то есть не является частью большего слова). Это предотвращает сопоставление S13 в S132,GRA,S12.

(Примечание. Ранее у меня было \b, что означает «граница слова», но регулярное выражение PostgreSQL этого не поддерживает, поэтому (?:^|\W) и (?!\w) - способы имитации этого.

1 голос
/ 25 января 2012

AFAIK, в регулярном выражении PostgreSQL нет word boundary, \b означает backspace.

Я хотел бы сделать:

SELECT '20'||substring('FUT,GRA,S12,1055559' from E'\\WS(\\d{2})\\W')

, где \W означает: не символ слова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...