1

これらの文は機能します

SELECT (regexp_matches('Euroschinus Hoff+300'::text, E'(Euroschinus Hoff[\+])([0- 9]+)'::text)::text[])[1]::text as counter 
select array_scientificname from simple_cal where array_scientificname ~ 'Semecarpus'

ただし、括弧がある場合は、テキストのどこを気にしないでください。どちらも機能しません

SELECT (regexp_matches('Euroschinus (testing) Hoff+300'::text, E'(Euroschinus (testing)  Hoff[\+])([0-9]+)'::text)::text[])[1]::text as counter 
select array_scientificname from simple_cal where array_scientificname ~  'Semecarpus(test)'

テキストを取得したいだけです。() には定義されたパターンはなく、テキストのどこにでも配置できます。

括弧の前に \ を使用するとうまくいくことに気付きましたが (以下を参照)、これはまったく実用的ではありません。文字列で () が許可されている場所を含める必要があると思います...

SELECT (regexp_matches('Euroschinus (testing) Hoff+300'::text, E'(Euroschinus jaffrei \\(testing\\) Hoff[\+])([0-9]+)'::text)::text[])[1]::text as counter
4

1 に答える 1

2

これは何も返しません:

SELECT (regexp_matches(
         'Euroschinus (testing) Hoff+300'::text
     , E'(Euroschinus jaffrei \\(testing\\) Hoff[\\+])([0-9]+)')::text[])[1]::text;

jaffreiパターンから文字列を削除すると、次のようになります。

SELECT (regexp_matches(
         'Euroschinus (testing) Hoff+300'::text
     , E'(Euroschinus \\(testing\\) Hoff[\\+])([0-9]+)')::text[]);[1]::text

正規表現を簡素化し、無意味な文字クラスを緩めます:

SELECT (regexp_matches(
         'Euroschinus (testing) Hoff+300'::text
     , E'(Euroschinus \\(testing\\) Hoff\\+)([0-9]+)')::text[])[1]::text;

バックスラッシュを追加する必要があるのが面倒な場合は、設定standard_conforming_strings(PostgreSQL 9.1 以降のデフォルト) を試して、Posix エスケープ シーケンスの代わりにプレーンな文字列を使用します。

SELECT (regexp_matches(
         'Euroschinus (testing) Hoff+300'::text
     , '(Euroschinus \(testing\) Hoff\+)([0-9]+)')::text[])[1]::text;

しかし、最初のヒットだけに興味がある場合は、最初から使用substring()した方がよいでしょう。括弧をキャプチャすると、必要な文字列が選択されます。

SELECT substring('Euroschinus (testing) Hoff+300'
              , '(Euroschinus \(testing\) Hoff\+)[0-9]+');

()最後に、 string 内に が存在するだけで煩わしい場合は(??)、それらを削除します。

SELECT substring(translate('Euroschinus (testing) Hoff+300', '()', '')
                        , '(Euroschinus testing Hoff\+)[0-9]+');
于 2012-07-19T13:30:27.253 に答える