Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex PostgreSQL正则表达式_Regex_Postgresql_Pattern Matching - Fatal编程技术网

Regex PostgreSQL正则表达式

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(

我有一个类似“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]','')

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

一个可以工作的正则表达式:

[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