Regex PostgreSQL正则表达式
我有一个类似“ABC3245-bG1353BcvG34”的字符串。我需要删除连字符,包括连字符后面的所有字母 所以上面的字符串应该是ABC3245135334 我尝试了以下代码:Regex PostgreSQL正则表达式,regex,postgresql,pattern-matching,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(
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]','')
但无法删除连字符后的字母。一个可以工作的正则表达式:
[a-zA-Z0-9]+(?=-)
请注意,这要求字符串实际包含连字符。它使用一个向前看来获取所有字母数字字符的子字符串,后跟一个连字符。固定版本
或者,更方便地处理集合(如桌子):
删除连字符后的所有非数字。(假设只有一个连字符。)结果:
第一版
错过了OP想要删除-
之后的所有字母的消息
SELECT regexp_replace('ABC3245-bG1353BcvG34', '-\D*', '')
结果:
ABC32451353BcvG34
Regex解释说:
-
。。文字连字符-
\D
*
。。0次或以上
删除第一个连字符和后面的所有内容,直到第一个数字
我需要删除连字符,包括连字符后面的所有字母
因此,上面的字符串(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
如果您的输入中可以有多个连字符,请定义如何处理连字符之间的字符。这只给出连字符后的字符串。如何仅删除此字符串中的字母不,此正则表达式返回连字符之前的所有内容,假设您的字符串正好是
ABC3245-bG1353BcvG34
。也许可以尝试锚定它:^[a-zA-Z0-9]+(?=-)
。但是,这不是问题中的ABC3245135334
。我需要删除连字符,包括连字符后面的所有字母。这个问题建议所有数字都应该保留在连字符后面(按原来的顺序)。@pozs:谢谢。我在第一次接近时没有达到确切的要求。添加了工作变体。效果很好。谢谢你,波兹!!
SELECT regexp_replace('ABC3245-bG1353BcvG34', '-\D*', '')
ABC32451353BcvG34
SELECT substring(input.value from '^[^-]*') ||
regexp_replace(substring(input.value from '[^-]*$'), '\D+', '', 'g')
FROM (SELECT 'ABC3245-bG1353BcvG34'::text AS value) AS input