PostgreSQL正则表达式

时间:2014-04-10 19:47:00

标签: regex postgresql pattern-matching

我有一个像'ABC3245-bG1353BcvG34'这样的字符串。我需要删除连字符,包括连字符后的所有字母。

所以上面的字符串应该是ABC3245135334

我尝试了以下代码:

select substring('ABC3245-bG1353BcvG34' from 1 for (position('-' in 'ABC3245-bG1353BcvG34')-1))||regexp_replace(substring('ABC3245-bG1353BcvG34' from (position('-' in 'ABC3245-bG1353BcvG34') +1) for length('ABC3245-bG1353BcvG34')),'[a-zA-Z]','')

但无法删除连字符后的字母。

3 个答案:

答案 0 :(得分:4)

  

我需要删除连字符,包括连字符后的所有字母。

     

所以上面的字符串(ABC3245-bG1353BcvG34)应该是ABC3245135334

这表明所有数字都应保留在连字符之后(按原始顺序排列)。如果这就是你想要的,你不能用一个正则表达式做到这一点。假设您的输入中只能连接1个连字符:

SELECT substring(input.value from '^[^-]*') ||
       regexp_replace(substring(input.value from '[^-]*$'), '\D+', '', 'g')
FROM (SELECT 'ABC3245-bG1353BcvG34'::text AS value) AS input

如果输入中有多个连字符,请定义如何处理连字符之间的字符。

答案 1 :(得分:2)

修正版

SELECT a[1] || regexp_replace(a[2], '\D', '', 'g')
FROM   string_to_array('ABC3245-bG1353BcvG34', '-') AS a

或者,更方便处理集合(如表):

SELECT split_part(str, '-', 1)
    || regexp_replace(split_part(str, '-', 2), '\D', '', 'g')
FROM  (SELECT 'ABC3245-bG1353BcvG34'::text AS str) tbl

在连字符后删除所有非数字。 (假设只有一个连字符。)结果:

ABC3245135334

第一个版本

错过了OP希望在-之后移除所有字母。

SELECT regexp_replace('ABC3245-bG1353BcvG34', '-\D*', '')

结果:

ABC32451353BcvG34

正则表达式解释说:

- ..字面连字符-
\D .. class shorthand for "non-digits".
* .. 0次或更多次

删除第一个连字符以及后面的所有内容,直到第一个数字。

答案 2 :(得分:0)

可行的RegEx:

[a-zA-Z0-9]+(?=-)

请注意,这需要字符串实际包含连字符。它使用前瞻来获取所有字母数字字符的子字符串,后跟连字符。