我需要你的帮助来解决这个问题。
我声明我无法在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
这意味着,在数字的前三位数之后,我需要设置短划线“ - ”
如何使用正则表达式实现此目的?
提前感谢您的合作!
答案 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');