正则表达式,真是个麻烦!

时间:2010-12-02 09:24:05

标签: regex plsql

我需要你的帮助来解决这个问题。

我声明我无法在Oracle PL / SQL中使用regolar表达式,但我保证我会尽快研究它们!

请假设您的表格中包含一个名为MY_COLUMN的列,类型为VARCHAR2(4000)。

此字符串填充如下:

Description of first no.;00123457;Description of 2nd number;91399399119;Third Descr.;13456

您可以看到字符串由几个数字(可以从零开始)和字符串(包含所有字母数字字符,以及点,',/,\等)组成:

Description1;Number1;Description2;Number2;Description3;Number3;......;DescriptionN;NumberN

当然,N是未知的,这意味着每条记录的夫妻数量可能因记录而异。

在每一对中,第一个元素始终是数字(,可以从零开始,我重复),第二个元素是字符串。

字段分隔符始终为分号(;)。

我想将数字转换如下:

00123457 ===> 001-23457
91399399119 ===> 913-99399119
13456 ===> 134-56

这意味着,在数字的前三位数之后,我需要设置短划线“ - ”

如何使用正则表达式实现此目的?

提前感谢您的合作!

1 个答案:

答案 0 :(得分:1)

我不知道Oracle / PL / SQL,但我可以提供一个正则表达式:

([[:digit:]]{3})([[:digit:]]+)

匹配至少四位数的数字,并与前面的数字分别记住前三位数。

RegexBuddy构造以下代码片段:

DECLARE
    result VARCHAR2(255);
BEGIN
    result := REGEXP_REPLACE(subject, '([[:digit:]]{3})([[:digit:]]+)', '\1-\2', 1, 0, 'c');
END;

如果您需要确保这些数字始终由;直接包围,您可以稍微改变一下:

(^|;)([[:digit:]]{3})([[:digit:]]+)(;|$)

但是,如果两个数字可以直接相互跟随(12345;67890只匹配第一个数字),则无效。如果这不是问题,请使用

result := REGEXP_REPLACE(subject, '(^|;)([[:digit:]]{3})([[:digit:]]+)(;|$)', '\1\2-\3\4', 1, 0, 'c');