我有以下字符串:
ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence
所以我想选择Sentence
,因为它是最后一个句点之后的字符串。我怎样才能做到这一点?
只是为了完整起见,这是一个使用正则表达式的解决方案(不是很复杂的恕我直言 :-)):
select regexp_substr(
'ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence',
'[^.]+$')
from dual
正则表达式
[^.]
+
以匹配其中的一个或多个$
将匹配限制在字符串的末尾您可能可以使用复杂的正则表达式来做到这一点。我喜欢以下方法:
select substr(str, - instr(reverse(str), '.') + 1)
当字符串在末尾时,没有什么比测试更有效了。关于 - 0 = 0 的东西。这是一个改进:
select (case when str like '%.' then ''
else substr(str, - instr(reverse(str), ';') + 1)
end)
编辑:
当我在本地 Oracle 和SQL Fiddle上运行您的示例时,您的示例都有效。
我正在运行此代码:
select (case when str like '%.' then ''
else substr(str, - instr(reverse(str), '.') + 1)
end)
from (select 'ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence' as str from dual) t
还有另一种方式。
从性能的角度来看,不确定哪个是最好的......
这里的区别是我们使用 -1 倒数找到最后一个。做instr的时候。
With CTE as
(Select 'ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence' str, length('ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence') len from dual)
Select substr(str,instr(str,'.',-1)+1,len-instr(str,'.',-1)+1) from cte;
select
substr(
'ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence',
INSTR(
'ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence',
'.',
-1
)+1
)
from dual;
该INSTR
函数接受第三个参数,即发生。它默认为 1(第一次出现),但也接受负数(意味着从最后一次出现倒数)。
select substr(str, instr(str, '.', -1) + 1)
from (
select 'ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence'
as str
from dual);
Sentence
一个字符串中有多少个点?
select length(str) - length(replace(str, '.', '') number_of_dots from ...
在最后一个点之后获取子字符串:
select substr(str, instr(str, '.', 1, number_of_dots)+1) from ...