11

我有以下字符串:

ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence

所以我想选择Sentence,因为它是最后一个句点之后的字符串。我怎样才能做到这一点?

4

6 回答 6

22

只是为了完整起见,这是一个使用正则表达式的解决方案(不是很复杂的恕我直言 :-)):

select regexp_substr(
  'ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence',
  '[^.]+$') 
from dual

正则表达式

  • 使用否定字符类来匹配除点之外的任何内容[^.]
  • 添加量词+以匹配其中的一个或多个
  • 使用锚$将匹配限制在字符串的末尾
于 2014-06-06T15:12:47.120 回答
17

您可能可以使用复杂的正则表达式来做到这一点。我喜欢以下方法:

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
于 2014-06-06T14:48:31.107 回答
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;
于 2014-06-06T15:09:42.323 回答
0
select 
  substr(
    'ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence',  
    INSTR(
      'ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence',
      '.',
      -1
    )+1
  ) 
from dual;
于 2020-02-17T20:50:30.933 回答
0

INSTR函数接受第三个参数,即发生。它默认为 1(第一次出现),但也接受负数(意味着从最后一次出现倒数)。

select substr(str, instr(str, '.', -1) + 1)
from (
    select 'ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence'
           as str
    from dual);

Sentence
于 2021-03-04T23:22:38.333 回答
-1

一个字符串中有多少个点?

select length(str) - length(replace(str, '.', '') number_of_dots from ...

在最后一个点之后获取子字符串:

select substr(str, instr(str, '.', 1, number_of_dots)+1) from ...
于 2014-06-06T15:01:03.390 回答