我想編寫一個regexp_like函數來識別字符串是否由兩個重複字符組成。它只會識別一個交替數字並且只包含兩個唯一數字的字符串,但唯一的數字不能重複,它必須交替。Oracle RegExp_Like用於兩個重複字符
要求:
正則表達式應匹配的模式爲787878787
,但它應該不匹配的模式787878788
它不應該考慮像000000000
我想編寫一個regexp_like函數來識別字符串是否由兩個重複字符組成。它只會識別一個交替數字並且只包含兩個唯一數字的字符串,但唯一的數字不能重複,它必須交替。Oracle RegExp_Like用於兩個重複字符
要求:
正則表達式應匹配的模式爲787878787
,但它應該不匹配的模式787878788
它不應該考慮像000000000
我想你想以下幾點:
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
希望這有助於。
模式您可以嘗試:
^(..)\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 ...
感謝您的回覆。不幸的是,在測試之後,它沒有根據需要確定價值 – NDubonix
你可能會做這樣的事情 -
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>
感謝您的回覆。該解決方案確實識別「787878787」的情況,但它也返回全部是相同數字的值,例如「000000000」。無論如何要指定必須存在多個唯一的數字? – NDubonix
是的,您只需添加一個「NOT」條件即可。看我的編輯。 –
感謝您的回覆。該解決方案確實識別「787878787」的情況,但它也返回全部是相同數字的值,例如「000000000」。無論如何要指定必須存在多個唯一的數字? – NDubonix
@NDubonix,是的,請看我的編輯。 –
大衛,謝謝!您是否可以提供REGEXP_LIKE函數的每個部分的細目以顯示每個部分的功能,類似於gwillie在之前的回覆中提供的內容。我理解子串部分,不需要澄清。 – NDubonix