我需要从路径目录中获取一个子字符串,该路径目录由 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'
(8010625之后的02)
在最后一种情况下,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,我需要第二组 ([^_]*_)
,对于三个 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。
最佳答案
我开始明白了。考虑这个测试用例:
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
(?:)
.. 非捕获括号
[^_\\]
.. 具有除 \
和 _
之外的任何字符的字符类
\d
.. 一个数字,与 [0-9] 有效
+
.. 1个或多个匹配(贪心)
$
.. 字符串结尾
[_\d]
.. 带有数字和 _
只有一个 pk 的情况需要不同的模式。使用 {1}
而不是 {3}
。
不确定为什么要转义反斜杠。在现代版本的 PostgreSQL 中 standard_conforming_strings
默认情况下是 on
,因此您不需要转义字符串中的反斜杠 - 但当然仍然是正则表达式。
关于regex - Postgres 正则表达式从路径中获取子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13080335/