regex - Postgres 正则表达式从路径中获取子字符串

标签 regex postgresql

我需要从路径目录中获取一个子字符串,该路径目录由 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/

相关文章:

regex - sed 正则表达式不工作

postgresql - Postgres 截断重新启动身份不重新启动身份

ruby-on-rails - Group by 和 order by 在 Rails 中有很多直通模型

javascript - 如何测试许多条件?

regex - 在 sed 中无法用新行替换数字,但可以在 sublime 中替换

javascript - 用于审查电子邮件的最佳正则表达式是什么?

sql - 优化plpgsql功能

sql - 计算 1 <-> 1..n 中最常见的值 | 0..N <-> 1 在一次查询中

Django休息框架: can't get user id from given token

Javascript RegExp-仅当A在X之前且B在X之后时如何匹配X