如何从以下字符串中选择abcdef.txt
?
abcdef.123.txt
我只知道如何通过select substr('abcdef.123.txt',1,6) from dual;
答案 0 :(得分:2)
你可以使用|| for concat和substr -3 for right part
select substr('abcdef.123.txt',1,6) || '.' ||substr('abcdef.123.txt',-3) from dual;
或避免连续(如Luc M建议的那样)
select substr('abcdef.123.txt',1,7) || substr('abcdef.123.txt',-3) from dual;
答案 1 :(得分:2)
一般解决方案,假设输入字符串恰好有两个句点.
并且您想要提取第一个和第三个标记,用一个.
分隔"标记的长度&#34 ;在输入字符串中可以是任意的(包括零!),它们可以包含.
select regexp_replace('abcde.123.xyz', '([^.]*).([^.]*).([^.]*)', '\1.\3') as result
from dual;
RESULT
---------
abcde.xyz
说明:
[ ]
表示匹配括号之间的任何字符。 ^
表示与括号中的字符不匹配 - 所以...... [^.]
表示匹配除.
*
表示匹配零或
更多事件,尽可能多("贪婪" 匹配)( ... )
称为子表达式 ...见下文'\1.\3
表示替换原始字符串
使用第一个子表达式,然后是.
,然后是第三个子表达式
子表达式 答案 2 :(得分:1)
用点替换由点(包括)包围的任何内容的子串。不依赖于字符串组件的长度:
SQL> select regexp_replace('abcdef.123.txt', '\..*\.', '.') fixed
from dual;
FIXED
----------
abcdef.txt
SQL>