捕获具有多种模式的起始字符
capture the starting characters with many patterns
我需要使用各种模式搜索从数据库对象中捕获起始字符。
我已经尝试使用 REGEX 表达式,下面是我正在尝试的查询和预期的数据集。
查询 1
SELECT
owner AS schema_name,
object_name,
object_type,
REGEXP_REPLACE(OBJECT_NAME, '^([A-Z0-9$]{1,})_.*', '') as BEGINNING,
count(*),
round(100*ratio_to_report(count(*)) over (), 4) percentage
FROM
dba_objects
GROUP BY
owner,
object_name,
object_type,
REGEXP_REPLACE(OBJECT_NAME, '^([A-Z0-9$]{1,})_.*', '')
ORDER BY
percentage desc;
预期数据集
OBJECT_NAME BEGINNING COUNT(*) PERCENT
ABC_CUST_INFO_D ABC 20 .00010
BBC_CUST_ENTRY_F BBC 100 .030
FHS_PRDCT_STST_T A$f 194 .031
GHS_INVTR_CD_DRY A1B 493 .051
#Tableau_6_sid:15251a_4i_2a #Tableau 4000 1.5
/15722c29d_PhotoImageCameraPro /15722c29d 5000 1.6
JAVA/15722c29d_PhotoImageqeeee JAVA 5000 1.6
不幸的是我无法分开下面的内容
#Tableau_6_sid:15251a_4i_2a --> #Tableau
/15722c29d_PhotoImageCameraPro --> /15722c29d
JAVA/15722c29d_PhotoImageqeeee --> JAVA
如何解决?
所以如何捕获 _ 之后的最后一个字符,下面是一个例子
查询 2 - 捕获最后一个字符
select
owner,
object_name,
object_type,
regexp_substr(object_name, '[^_]*$') ENDING,
count(*) COUNT,
round(100*ratio_to_report(count(*)) over (), 4) percentage
from
dba_objects
where object_name like '%/%'
group by
owner,
object_name,
object_type,
regexp_substr(object_name, '[^_]*$')
ORDER BY
percentage desc
预期数据集
OBJECT_NAME BEGINNING COUNT(*) PERCENT
ABC_CUST_INFO_D D 20 .00010
BBC_CUST_ENTRY_F F 100 .030
FHS_PRDCT_STST_T T 194 .031
GHS_INVTR_CD_DRY DRY 493 .051
Teradata/jdbc/EXAcore/MPPReader MPPReader 5000 1.6
sqlj/modegen/engine/FuncInit FuncInit 8000 6.0
moon/aio/af/ext/ISCII11$Decoder ISCII11$Decoder 8700 6.1
不幸的是我无法分开下面的内容
Teradata/jdbc/EXAcore/MPPReader --> MPPReader
sqlj/modegen/engine/FuncInit --> FuncInit
moon/aio/af/ext/ISCII11$解码器 --> ISCII11$解码器
对于正则表达式,您可以在字符 class 中添加匹配的 /
和 #
,然后匹配尽可能少的字符,直到下一个 /
或 _
使用另一个字符 class.
如果模式不区分大小写,您还可以添加 a-z
^([A-Za-z0-9$/#]+?)[/_].*
如果/
和#
只能在开头,您也可以选择匹配其中一个:
^([/#]?[A-Za-z0-9$]+)[/_].*
再看一个regex demo
我需要使用各种模式搜索从数据库对象中捕获起始字符。
我已经尝试使用 REGEX 表达式,下面是我正在尝试的查询和预期的数据集。
查询 1
SELECT
owner AS schema_name,
object_name,
object_type,
REGEXP_REPLACE(OBJECT_NAME, '^([A-Z0-9$]{1,})_.*', '') as BEGINNING,
count(*),
round(100*ratio_to_report(count(*)) over (), 4) percentage
FROM
dba_objects
GROUP BY
owner,
object_name,
object_type,
REGEXP_REPLACE(OBJECT_NAME, '^([A-Z0-9$]{1,})_.*', '')
ORDER BY
percentage desc;
预期数据集
OBJECT_NAME BEGINNING COUNT(*) PERCENT
ABC_CUST_INFO_D ABC 20 .00010
BBC_CUST_ENTRY_F BBC 100 .030
FHS_PRDCT_STST_T A$f 194 .031
GHS_INVTR_CD_DRY A1B 493 .051
#Tableau_6_sid:15251a_4i_2a #Tableau 4000 1.5
/15722c29d_PhotoImageCameraPro /15722c29d 5000 1.6
JAVA/15722c29d_PhotoImageqeeee JAVA 5000 1.6
不幸的是我无法分开下面的内容
#Tableau_6_sid:15251a_4i_2a --> #Tableau
/15722c29d_PhotoImageCameraPro --> /15722c29d
JAVA/15722c29d_PhotoImageqeeee --> JAVA
如何解决?
所以如何捕获 _ 之后的最后一个字符,下面是一个例子
查询 2 - 捕获最后一个字符
select
owner,
object_name,
object_type,
regexp_substr(object_name, '[^_]*$') ENDING,
count(*) COUNT,
round(100*ratio_to_report(count(*)) over (), 4) percentage
from
dba_objects
where object_name like '%/%'
group by
owner,
object_name,
object_type,
regexp_substr(object_name, '[^_]*$')
ORDER BY
percentage desc
预期数据集
OBJECT_NAME BEGINNING COUNT(*) PERCENT
ABC_CUST_INFO_D D 20 .00010
BBC_CUST_ENTRY_F F 100 .030
FHS_PRDCT_STST_T T 194 .031
GHS_INVTR_CD_DRY DRY 493 .051
Teradata/jdbc/EXAcore/MPPReader MPPReader 5000 1.6
sqlj/modegen/engine/FuncInit FuncInit 8000 6.0
moon/aio/af/ext/ISCII11$Decoder ISCII11$Decoder 8700 6.1
不幸的是我无法分开下面的内容
Teradata/jdbc/EXAcore/MPPReader --> MPPReader
sqlj/modegen/engine/FuncInit --> FuncInit
moon/aio/af/ext/ISCII11$解码器 --> ISCII11$解码器
对于正则表达式,您可以在字符 class 中添加匹配的 /
和 #
,然后匹配尽可能少的字符,直到下一个 /
或 _
使用另一个字符 class.
如果模式不区分大小写,您还可以添加 a-z
^([A-Za-z0-9$/#]+?)[/_].*
如果/
和#
只能在开头,您也可以选择匹配其中一个:
^([/#]?[A-Za-z0-9$]+)[/_].*
再看一个regex demo