2014-12-29 85 views
2

我想編寫一個regexp_like函數來識別字符串是否由兩個重複字符組成。它只會識別一個交替數字並且只包含兩個唯一數字的字符串,但唯一的數字不能重複,它必須交替。Oracle RegExp_Like用於兩個重複字符

要求:

正則表達式應匹配的模式爲787878787,但它應該匹配的模式787878788 它不應該考慮像000000000

回答

1

我想你想以下幾點:

WITH t1 AS (
    SELECT '787878787' AS str FROM dual 
    UNION 
    SELECT '787878788' AS str FROM dual 
    UNION 
    SELECT '7878787878' AS str FROM dual 
    UNION 
    SELECT '78' AS str FROM dual 
) 
SELECT * FROM t1 
WHERE REGEXP_LIKE(str, '^(.)(.)(\1\2)*\1?$') 
    AND SUBSTR(str, 1, 1) != SUBSTR(str, 2, 1) 

在字符串與它開始相同的字符結束。這將覆蓋的情況下(在要求中提到)。如果只需要數字,請將正則表達式中的.替換爲\d

更新:

這裏是正則表達式如何分解:

^ = start of string 
(.) = first character - can be anything - in parentheses to capture it and use it in a backreference 
(.) = second character - can be anything 
\1 = backreference to first captured group 
\2 = backreference to second captured group 
(\1\2)* = These should appear together zero or more times 
\1? = The first captured group should appear zero or one times 
$ = end of the string 

希望這有助於。

+0

感謝您的回覆。該解決方案確實識別「787878787」的情況,但它也返回全部是相同數字的值,例如「000000000」。無論如何要指定必須存在多個唯一的數字? – NDubonix

+0

@NDubonix,是的,請看我的編輯。 –

+0

大衛,謝謝!您是否可以提供REGEXP_LIKE函數的每個部分的細目以顯示每個部分的功能,類似於gwillie在之前的回覆中提供的內容。我理解子串部分,不需要澄清。 – NDubonix

0

模式您可以嘗試:

^(..)\1*$ 

細分:

^ - assert beginning of line 
(..) - capture the first 2 characters 
\1* - repeat the captured group pattern zero or more times 
$ - assert end of line 

未經測試在Oracle ...

+0

感謝您的回覆。不幸的是,在測試之後,它沒有根據需要確定價值 – NDubonix

1

你可能會做這樣的事情 -

SQL> WITH DATA AS(
    2 SELECT '787878787' str FROM dual UNION ALL 
    3 SELECT '787878788' FROM dual 
    4 ) 
    5 SELECT * 
    6 FROM DATA 
    7 WHERE REGEXP_LIKE(str, '(\d+?)\1') 
    8 AND SUBSTR(str, 1,1) = SUBSTR(str, -1, 1) 
    9/

STR 
--------- 
787878787 

SQL> 

既然你只與數字打交道,我用\d

\d+?將匹配數字,並且,\1是被捕獲的數字。 AND條件中的substr正在檢查字符串的第一個和最後一個數字是否相同。

編輯:由OP

附加要求爲了避免這樣00000000的數字,你需要一個NOT條件添加到謂語。

SQL> WITH DATA AS 
    2 (SELECT '787878787' str FROM dual 
    3 UNION ALL 
    4 SELECT '787878788' FROM dual 
    5 UNION ALL 
    6 SELECT '787878788' FROM dual 
    7 ) 
    8 SELECT * 
    9 FROM DATA 
10 WHERE REGEXP_LIKE(str, '(\d+?)\1') 
11 AND SUBSTR(str, 1,1) = SUBSTR(str, -1, 1) 
12 AND SUBSTR(str, 2,1) <> SUBSTR(str, -1, 1) 
13/

STR 
--------- 
787878787 

SQL> 
+0

感謝您的回覆。該解決方案確實識別「787878787」的情況,但它也返回全部是相同數字的值,例如「000000000」。無論如何要指定必須存在多個唯一的數字? – NDubonix

+0

是的,您只需添加一個「NOT」條件即可。看我的編輯。 –