Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgres regex从路径获取子字符串_Regex_Postgresql - Fatal编程技术网

Postgres regex从路径获取子字符串

Postgres regex从路径获取子字符串,regex,postgresql,Regex,Postgresql,我需要从一个路径目录中获取一个子字符串,该路径目录由两个数字组成,前面加上一个“\u1”。字符串类似于: 'P:\pgdfecol\71698384737978\INFENTECONTROL\2011_9_43\2011_9_46_43_29_10.ZIP' 在这个例子中,我想得到46后面的43 在最后一个反斜杠之后,按照下一条规则存储路径: '\TablesPK_twoCharactersClassification_twoCharactersDocumentType_anything.ZI

我需要从一个路径目录中获取一个子字符串,该路径目录由两个数字组成,前面加上一个“\u1”。字符串类似于:

'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)

(需要INBP后的22)

(需要第29条)

(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,我需要第二组
([^\u]*\ u)
,第三组是第四组,依此类推

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]相同
+
。。一个或多个匹配项(贪婪)
$
。。字符串末尾
[\ud]
。。带有数字和
的字符类

只有一个pk的案例需要不同的模式。使用
{1}
代替
{3}


不知道你为什么要逃避反斜杠。在现代版本的PostgreSQL中,默认情况下是
打开的
,因此您不需要在字符串中转义反斜杠,但当然还是在正则表达式中。

您好,谢谢您的回答,但它没有显示任何内容,结果是一个空字符串。我跳过了反斜杠,因为它在pgAdmin 1.14中给出了一个错误“字符串文字中“\\”的非标准使用…”。此外,主键可以是任意数量的字段,而不仅仅是数字。现在,您需要公开您的PostgreSQL版本。总是。把这个加到你的问题上。我怀疑您有一个较旧的版本,带有
标准字符串=off
。。。pgAdmin只是GUI,与问题无关。不,你是对的。字符串中不需要转义的反斜杠,但在regex中添加几个示例值(可能有变化)也会很有帮助,以明确您需要什么。并添加数据库要显示的
标准字符串。为什么在
8010625\u 02\u 04\u 20110111.ZIP中的
.ZIP
之前没有
.ZIP
?这不是强制性的。在“TwoCharactersDocumentType”之后可以是任何内容。唯一可以确定的是,在表的主键之后总是出现分类和文档类型。但它总是
和两位数之间的数字和
.zip
?我想我现在的解决方案中已经包含了所有内容。不,02_04之后可能会出现数字、字母或更多,这还不确定。这就是我从最后一个反斜杠开始过滤的原因,因为在.zip可以执行任何操作之前。它遵循“格式”\tablePK\u两个字符分类\u两个字符文档类型\u任何内容\u包括字母.ZIP。分类和文档类型始终介于“”和“”之间。
select substring(substring(substring('P:\pgdfecol\71698384737978\ASOCIADOS\8010625\8010625_02_04_20110111.ZIP' from '([^\\]*(\.ZIP|zip))') from '([^_]*_){2}') from '[0-9]{2}')
select substring(substring(substring('P:\pgdfecol\71698384737978\ACTASCOMITE\ACRE123\ACRE123_17_11_.ZIP' from '([^\\]*(\.ZIP|zip))') from '([^_]*_){2}') from '[0-9]{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