ORACLE 字符串处理 正则截取

本文介绍如何在Oracle数据库中使用正则表达式解析URL中的产品类目信息,包括截取特定字符前的部分,涉及Oracle字符串处理函数trim、instr等的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前几天碰上个小需求,截取url中的产品类目信息。产品类目的url如下(域名略)
/women-c2
/women-n25?jsort=1234

简单观察下,就是从/开始,截到-c/-n + 数字为止。
以前这种需求都是用substr加instr搞定,结果这次发现不行了,原因是因为这次截止字符不确定。考虑了下,用正则先把截止字符解析出来
select regexp_substr(request_uri,'(-c\d+|-n\d+)',1,1) from dual
找到截止字符的位置,一切就好办了,用以前的办法搞定
select  substr(request_uri,2,instr(request_uri,regexp_substr(request_uri,'(-c\d+|-n\d+|-b\d+)',1,1),1,1)-2) from dual


补充下oracle里字符串处理

Oracle trim函数

trim(trailing 'h' from 'haahbbhh') 截断后面的h,最后得出haahbb

Oracle instr函数

从一个字符串中查找指定子串的位置

从字符串'yuechaotianyuechao'的第一个位置开始,查找第一个出现子串'ao'出现的位置。

SQL>select instr('yuechaotianyuechao','ao') position from dual; 返回6

从第7个字符开始搜索

SQL> select instr('yuechaotianyuechao','ao', 7) position from dual  返回17

从第1个字符开始,搜索第2次出现子串的位置

SQL> select instr('yuechaotianyuechao','ao', 1, 2) position from dual;  返回17




<think>我们需要从字符串的最后开始截取,在Oracle中可以使用SUBSTR函数结合负数的起始位置来实现。 具体语法:SUBSTR(字符串, 起始位置, 长度) 当起始位置为负数时,表示从字符串的末尾开始倒数(即倒数第n个字符作为起始位置)。 例如,要从字符串的最后截取3个字符:SUBSTR('abcde', -3, 3) 返回 'cde' 另外,也可以使用INSTR函数从后往前查找,但这里我们只需要截取,所以用SUBSTR的负数位置即可。 注意:如果截取的长度超过从起始位置到字符串开头的长度,则返回从起始位置到字符串开头的所有字符。 示例:从字符串'Hello World'的最后截取5个字符: SELECT SUBSTR('Hello World', -5, 5) FROM DUAL; -- 返回 'World' 如果要从倒数第6个字符开始截取到末尾(不指定长度或长度超过剩余长度): SELECT SUBSTR('Hello World', -6) FROM DUAL; -- 返回 ' World'(注意前面有个空格) 所以,根据需求,我们可以使用负数位置来从字符串最后开始截取。</think>在Oracle中,从字符串末尾开始截取可以使用以下方法: ### 1. 使用`SUBSTR()`函数配合负数位置 ```sql -- 语法:SUBSTR(字符串, 负数起始位置, 截取长度) SELECT SUBSTR('Oracle Database', -7, 4) FROM dual; -- 返回 'Data' ``` - **负数起始位置**:`-1`表示最后一个字符,`-2`表示倒数第二个,依此类推 - **截取长度**:可选参数,不指定时截取字符串末尾 ### 2. 结合`LENGTH()`动态截取 ```sql -- 截取最后N个字符(示例截取最后5字符) SELECT SUBSTR('1234567890', LENGTH('1234567890')-4) FROM dual; -- 返回 '67890' ``` ### 3. 正则表达式截取(11g+) ```sql SELECT REGEXP_SUBSTR('ABC-DEF-GHI', '[^-]+$') FROM dual; -- 返回 'GHI' ``` 适用于按分隔符截取末尾片段 ### 实际应用示例 ```sql -- 获取文件名后缀(截取最后一个点之后的内容) SELECT SUBSTR('document_backup.zip', INSTR('document_backup.zip', '.', -1)+1) FROM dual; -- 返回 'zip' -- 获取路径中最后一级目录 SELECT SUBSTR('/home/user/docs', INSTR('/home/user/docs', '/', -1)+1) FROM dual; -- 返回 'docs' ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值