我有一个像'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]','')
但无法删除连字符后的字母。
答案 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]+(?=-)
请注意,这需要字符串实际包含连字符。它使用前瞻来获取所有字母数字字符的子字符串,后跟连字符。