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 回答