我有以下字符串:
ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence
所以我想选择Sentence
因为它是最后一个句点之后的字符串。我怎么能这样做?
答案 0 :(得分:14)
您可以使用复杂的正则表达式执行此操作。我喜欢以下方法:
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 :(得分:11)
为了完整起见,这里是使用正则表达式的解决方案(不是很复杂的恕我直言:-)):
select regexp_substr(
'ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence',
'[^.]+$')
from dual
正则表达式
[^.]
+
以匹配其中一个或多个$
来限制与字符串结尾的匹配答案 2 :(得分:1)
还有另一种方式。
从性能角度来看,最不合适......
这里的区别在于我们使用-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;
答案 3 :(得分:0)
select
substr(
'ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence',
INSTR(
'ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence',
'.',
-1
)+1
)
from dual;
答案 4 :(得分:0)
INSTR
函数接受第三个参数,即出现次数。它默认为 1(第一次出现),但也接受负数(意味着从最后一次出现向后计数)。
select substr(str, instr(str, '.', -1) + 1)
from (
select 'ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence'
as str
from dual);
Sentence
答案 5 :(得分:-1)
字符串中有多少个点?
select length(str) - length(replace(str, '.', '') number_of_dots from ...
在最后一个点后得到子串:
select substr(str, instr(str, '.', 1, number_of_dots)+1) from ...