我想获取字符串的子字符串,如:filename_ip_time.pdf 我想选择filename_ip,这是直到最后一次出现'_'
的字符串答案 0 :(得分:3)
使用-1作为INSTR的起始位置,从字符串末尾开始搜索:
select INSTR('filename_ip_time.pdf', '_', -1) from dual
因此,如果你想选择filename_ip,你应该这样做:
SELECT SUBSTR ('filename_ip_time.pdf',
0,
(INSTR ('filename_ip_time.pdf', '_', -1)) - 1)
FROM DUAL
答案 1 :(得分:1)
使用REGEXP_REPLACE()进行参数的另一种方法:
SQL> select regexp_replace('filename_ip_time.pdf', '^(.*)_.*$', '\1') from dual;
REGEXP_REPL
-----------
filename_ip
SQL>
正则表达式可以读作: 返回模式匹配的第一个记住的组(\ 1):
^ Start of the line
( start the first group to remember
. any character
* any number of the previous character (any character)
) end the first group, followed by
_ A literal underscore
.* followed by any number of any characters
$ until the end of the line.
所以从本质上讲,你将返回字符串的第一部分,但不包括最后一个下划线,后面是其余部分。对我来说,比嵌套的substr()和instr()更清晰,但你需要了解正则表达式,当你需要做更复杂的模式匹配时,这将最终给你更多的力量。
答案 2 :(得分:0)
您只需使用 SUBSTR 和 INSTR 即可。
例如,
此处INSTR将从最后给出
_
的第一个位置。
SQL> WITH DATA AS(
2 SELECT 'filename_ip_time.pdf' str FROM dual
3 )
4 SELECT SUBSTR(str, 1, instr(str, '_', -1, 1) -1) FROM DATA
5 /
SUBSTR(STR,
-----------
filename_ip
SQL>
或者,
如果您知道在第二次出现
_
之前需要substr,那么请使用INSTR从一开始就获取第二次出现_
的位置。
例如,
SQL> WITH DATA AS(
2 SELECT 'filename_ip_time.pdf' str FROM dual
3 )
4 SELECT SUBSTR(str, 1, instr(str, '_', 1, 2) -1) FROM DATA
5 /
SUBSTR(STR,
-----------
filename_ip
SQL>