我想提取某些字串的 2 部分。為此,我想使用正則運算式。例如,字串是:Big_Dog_0044_0080,我的正則運算式是:Big_Dog_([0-9] )_?([0-9A-Z]*) 第 1 組是 0044,第二組是 0080。
現在我的問題是把它帶入一個 select 陳述句:我用 regex_substr 試過了。
這是我的結果:
select
'Big_Dog_0044_0080' as TestString,
regexp_substr('Big_Dog_0044_0080', '([0-9] )') Group1 ,
regexp_substr('Big_Dog_0044_0080', '([0-9A-Z]*)') Group2 from dual;
我的輸出:
TESTSTRING Group1 Group2
Big_Dog_0044_0080 0044 B
首先,第 2 組是錯誤的,我希望是 0080。我在這里做錯了什么?
第二個問題,還有其他方法可以解決這個問題嗎?我想使用 5-6 個不同的正則運算式。例如下一個是 ([AC])_CatWeezle
我的意思是選擇輸入字串列并通過可能的正則運算式。如果一個正則運算式匹配,則停止并提取值。
謝謝!
uj5u.com熱心網友回復:
我在這里做錯了什么?
正則運算式'([0-9A-Z]*)'將匹配字串中第一次出現的零個或多個數字或大寫字母字符。對于您的字串'Big_Dog_0044_0080',第一個字符是大寫字母字符,B以便匹配,第二個字符i與您的正則運算式不匹配,因此它不包含在組中。
您宣告您的字串與模式匹配:
Big_Dog_([0-9] )_?([0-9A-Z]*)
然后,您可以使用以下命令將模式錨定到字串的末尾,$并且可以使用:
WITH test_data (value) AS (
SELECT 'Big_Dog_0044_0080' FROM DUAL UNION ALL
SELECT 'Big_Dog_00440080' FROM DUAL UNION ALL
SELECT 'Big_Dog_00440A80' FROM DUAL
)
SELECT value,
REGEXP_SUBSTR(value, '([0-9] )_?([0-9A-Z]*)$', 1, 1, NULL, 1) AS Group1 ,
REGEXP_SUBSTR(value, '([0-9] )_?([0-9A-Z]*)$', 1, 1, NULL, 2) AS Group2
FROM test_data;
哪些輸出:
價值 GROUP1 組2 Big_Dog_0044_0080 0044 0080 Big_Dog_00440080 00440080 Big_Dog_00440A80 00440 A80
(注意:第二行與第一組完全匹配,第二組寬度為零,第三行將匹配第一組,直到找到非數字字符,然后開始第二組。)
如果分隔下劃線是可選的,那么您可能需要使用固定寬度的匹配(假設每個子字串都是 4 個字符):
WITH test_data (value) AS (
SELECT 'Big_Dog_0044_0080' FROM DUAL UNION ALL
SELECT 'Big_Dog_00440080' FROM DUAL UNION ALL
SELECT 'Big_Dog_00440A80' FROM DUAL
)
SELECT value,
REGEXP_SUBSTR(value, '([0-9]{4})_?([0-9A-Z]{4})$', 1, 1, NULL, 1) AS Group1 ,
REGEXP_SUBSTR(value, '([0-9]{4})_?([0-9A-Z]{4})$', 1, 1, NULL, 2) AS Group2
FROM test_data;
哪些輸出:
價值 GROUP1 組2 Big_Dog_0044_0080 0044 0080 Big_Dog_00440080 0044 0080 Big_Dog_00440A80 0044 0A80
我的意思是選擇輸入字串列并通過可能的正則運算式。如果一個正則運算式匹配,則停止并提取值。
使用CASE運算式:
WITH test_data (value) AS (
SELECT 'Big_Dog_0044_0080' FROM DUAL UNION ALL
SELECT 'Big_Dog_00440080' FROM DUAL UNION ALL
SELECT 'Big_Dog_00440A80' FROM DUAL UNION ALL
SELECT 'A_CatWeezle' FROM DUAL
)
SELECT value,
CASE
WHEN REGEXP_LIKE(value, '^Big_Dog_(\d{4})_?([0-9A-Z]{4})$')
THEN REGEXP_SUBSTR(value, '^Big_Dog_(\d{4})_?([0-9A-Z]{4})$', 1, 1, NULL, 1)
WHEN REGEXP_LIKE(value, '^([A-C])_CatWeezle$')
THEN REGEXP_SUBSTR(value, '^([A-C])_CatWeezle$', 1, 1, NULL, 1)
END AS group1,
CASE
WHEN REGEXP_LIKE(value, '^Big_Dog_(\d{4})_?([0-9A-Z]{4})$')
THEN REGEXP_SUBSTR(value, '^Big_Dog_(\d{4})_?([0-9A-Z]{4})$', 1, 1, NULL, 2)
END AS group2
FROM test_data;
輸出:
價值 GROUP1 組2 Big_Dog_0044_0080 0044 0080 Big_Dog_00440080 0044 0080 Big_Dog_00440A80 0044 0A80 A_CatWeezle 一個
db<>在這里擺弄
uj5u.com熱心網友回復:
問題的第一部分很簡單:
SQL> SELECT 'Big_Dog_0044_0080' AS TestString,
2 REGEXP_SUBSTR ('Big_Dog_0044_0080', '\d ', 1, 1) Group1,
3 REGEXP_SUBSTR ('Big_Dog_0044_0080', '\d ', 1, 2) Group2
4 FROM DUAL;
TESTSTRING GROU GROU
----------------- ---- ----
Big_Dog_0044_0080 0044 0080
SQL>
我不太明白你說CatWeezle的意思。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/385731.html
上一篇:OracleVIEW顯示在我的表中創建最后一條記錄的時間
下一篇:如何獲取OracleAPEX文本欄位值(現在我得到的一切都是NULL)(OracleAPEXApplicationExpress21.1)
