首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用多种模式捕获起始字符

用多种模式捕获起始字符
EN

Stack Overflow用户
提问于 2020-11-16 21:09:21
回答 1查看 77关注 0票数 1

我需要用各种模式搜索从数据库对象中捕获起始字符。

我尝试过使用REGEX表达式,下面的查询是我正在尝试的,以及预期的数据集。

查询1

代码语言:javascript
复制
SELECT
   owner AS schema_name, 
   object_name,        
   object_type,
   REGEXP_REPLACE(OBJECT_NAME, '^([A-Z0-9$]{1,})_.*', '\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,})_.*', '\1') 
ORDER BY
   percentage desc; 

期望数据集

代码语言:javascript
复制
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 ->

如何解决?

因此,如何捕获后面的最后一个字符,下面是一个示例

查询2-捕获最后一个字符

代码语言:javascript
复制
 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

期望数据集

代码语言:javascript
复制
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

不幸的是,我无法将下面的内容分开

/jdbc/EXAcore/MPPReader-> MPPReader

sqlj/modegen/engine/FuncInit -> FuncInit

月亮/aio/af/ext/ISCII11 11美元解码器-> ISCII11$Decoder

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-16 21:16:52

对于正则表达式,可以在字符类中添加匹配的/#,然后尽可能地匹配字符,直到使用另一个字符类直到下一个/_为止。

如果模式不区分大小写,还可以添加a-z

代码语言:javascript
复制
^([A-Za-z0-9$/#]+?)[/_].*

Regex演示

如果/#只能在开头,您还可以选择匹配它们中的任何一种:

代码语言:javascript
复制
^([/#]?[A-Za-z0-9$]+)[/_].*

见另一个regex演示

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64865763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档