3

我需要从一个路径目录中获取一个子字符串,该路径目录由前面的 2 个数字组成,后面跟着一个“_”。字符串是这样的:

'P:\pgdfecol\71698384737978\INFENTECONTROL\2011_9_43\2011_9_46_43_29_10.ZIP'

在这种情况下,我想在 46 之后获得 43。

路径按照下一条规则存储,在最后一个反斜杠之后:

'\TablesPK_twoCharactersClassification_twoCharactersDocumentType_anything.ZIP'

我想得到分类。问题是表的主键可能不止一个字段,尽管我知道每种情况下 pk 中有多少字段。

我得到了这样的东西:

select substring(substring(substring('P:\pgdfecol\71698384737978\INFENTECONTROL\2011_9_43\2011_9_46_43_29_10.ZIP' from '([^\\]*(\.ZIP|zip))') from '([^_]*_){4}') from '[0-9]{2}')

但我想要更简单的东西。

其他情况:

'P:\pgdfecol\71698384737978\INFENTECONTROL\2011_03_46\2011_03_46_46_48_.ZIP'

(需要第二个46)

'P:\pgdfecol\71698384737978\INFCONTABLE\2009_05_INBP\2009_05_INBP_22_28_.ZIP'

(需要INBP后的22)

'P:\pgdfecol\71698384737978\INFOFICIAL\2007_06_MB\2007_06_MB_29_28_.ZIP'

(需要29)

'P:\pgdfecol\71698384737978\ASOCIADOS\8010625\8010625_02_04_20110111.ZIP'

(02 后 8010625)

在最后一种情况下,pk只有一个字段,所以我把这句话改成了:

select substring(substring(substring('P:\pgdfecol\71698384737978\ASOCIADOS\8010625\8010625_02_04_20110111.ZIP' from '([^\\]*(\.ZIP|zip))') from '([^_]*_){2}') from '[0-9]{2}')

对于一个 Pk,我需要第二组([^_]*_),对于三个第四组,依此类推..

select substring(substring(substring('P:\pgdfecol\71698384737978\ACTASCOMITE\ACRE123\ACRE123_17_11_.ZIP' from '([^\\]*(\.ZIP|zip))') from '([^_]*_){2}') from '[0-9]{2}')

(我得到 17 个)

我正在使用 postgres 9.0。

4

1 回答 1

2

我开始明白了。考虑这个测试用例:

WITH x(txt) AS ( VALUES
     ('P:\pgdfecol\71698384737978\INFENTECONTROL\2011_9_43\2011_9_46_43_29_10.ZIP')  -- 43
    ,('P:\pgdfecol\71698384737978\INFENTECONTROL\2011_03_46\2011_03_46_46_48_.ZIP')  --need the second 46
    ,('P:\pgdfecol\71698384737978\INFCONTABLE\2009_05_INBP\2009_05_INBP_22_28_.ZIP') --need the 22 after INBP
    ,('P:\pgdfecol\71698384737978\INFOFICIAL\2007_06_MB\2007_06_MB_29_28_.ZIP')      --need the 29
    )
SELECT txt, substring(txt, '\\(?:[^_\\]+_){3}(\d\d)_[^\\]*\.(?:ZIP|zip)$')
FROM   x

(?:).. 非捕获括号.. 具有除and
[^_\\]之外的任何字符的字符类.. 一个数字,有效地与 [0-9] 相同.. 1 个或多个匹配项(贪婪).. 字符串结尾.. 具有数字和的字符类\_
\d
+
$
[_\d]_

只有一个 pk 的情况需要不同的模式。使用{1}而不是{3}.

不知道为什么要逃避反斜杠。在现代版本的 PostgreSQLstandard_conforming_strings中是on默认的,所以你不需要在字符串中转义反斜杠 - 但当然仍然是正则表达式。

于 2012-10-26T03:50:08.057 回答