2010-12-02 57 views
0

我需要你的善意幫助來解決這個問題。正則表達式,真是麻煩!

我聲明我不能在Oracle PL/SQL中使用regolar表達式,但我保證我會盡快研究它們!

請假設您有一個名爲MY_COLUMN的類型爲VARCHAR2(4000)的列的表。

這colums填充如下:

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

你可以看到串由幾個數字(這可能與零開頭)組成,和字符串(包含所有字母數字字符,並且還點, 」,/,\,等等):

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

當然,N是未知的,這意味着夫婦對每條記錄的數量可從記錄變化來記錄。

在每一對中,第一個元素總是數字(,可能以0開頭,我重複),第二個元素是字符串。

字段分隔符總是分號(;)。

我想如下變換的數字:

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

這意味着,該號碼的前三位數字後,我需要把一個破折號「 - 」

我如何能實現這使用正則表達式?

非常感謝您的合作!

回答

1

我不知道甲骨文/ 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'); 
+0

完美的解決方案,它的工作原理非常棒!非常感謝!! ;-) – UltraCommit 2010-12-02 15:22:31