Ты выглядишь, как будто ты почти там - тебе просто нужно добавить '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)
- способы имитации этого.