我在这里做错了什么?
正则表达式'([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;
哪些输出:
| VALUE |
GROUP1 |
GROUP2 |
| 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;
哪些输出:
| VALUE |
GROUP1 |
GROUP2 |
| 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;
输出:
| VALUE |
GROUP1 |
GROUP2 |
| Big_Dog_0044_0080 |
0044 |
0080 |
| Big_Dog_00440080 |
0044 |
0080 |
| Big_Dog_00440A80 |
0044 |
0A80 |
| A_CatWeezle |
A |
|
db小提琴here