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'

(2 番目の 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 は 1 つのフィールドだけなので、文を次のように変更しました。

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

1 Pk の場合は の 2 番目のセットが必要であり、([^_]*_)3 の場合は 4 番目のセットが必要です。

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

(?:).. 非キャプチャ括弧..および
[^_\\]を除く任意の文字を含む文字クラス.. 事実上 [0-9] と同じ数字.. 1 つ以上の一致 (貪欲) .. 文字列の末尾.. 数字を含む文字クラス および\_
\d
+
$
[_\d]_

pk が 1 つだけの場合は、別のパターンが必要です。{1}の代わりに使用し{3}ます。

バックスラッシュをエスケープする理由がわかりません。PostgreSQL の最新バージョンでstandard_conforming_stringson、デフォルトで文字列内のバックスラッシュをエスケープする必要はありませんが、もちろん正規表現のままです。

于 2012-10-26T03:50:08.057 に答える