句子中的最后一个单词:在SQL中(正则表达式可能吗?)

时间:2010-10-11 18:33:21

标签: regex algorithm oracle string plsql

我需要在Oracle SQL(10gR2)中完成此操作。但我想,我宁愿说清楚,任何好的,有效的算法都可以。

给定一行(或句子,包含一个或多个单词,英语),你如何找到句子的最后一个单词?

这是我在SQL中尝试过的。但是,我希望看到一种有效的方法。

select reverse(substr(reverse(&p_word_in)
                         , 0
                         , instr(reverse(&p_word_in), ' ')
                         )
                  )
      from dual;

想法是反转字符串,找到第一个出现的空格,检索子字符串并反转字符串。它效率很高吗?是正则表达式吗?我在Oracle 10g R2上。但我不介意看到任何其他编程语言的尝试,如果需要,我不介意编写PL / SQL函数。

更新

Jeffery Kemp给出了一个很好的答案。这非常有效。

答案

SELECT SUBSTR(&sentence, INSTR(&sentence,' ',-1) + 1)
FROM dual

5 个答案:

答案 0 :(得分:7)

我认为使用INSTR / SUBSTR更简单:

WITH q AS (SELECT 'abc def ghi' AS sentence FROM DUAL)
SELECT SUBSTR(sentence, INSTR(sentence,' ',-1) + 1)
FROM q;

答案 1 :(得分:2)

不确定性能如何,但应该这样做:

select regexp_substr(&p_word_in, '\S+$') from dual;

答案 2 :(得分:1)

我不确定你是否可以在oracle中使用正则表达式,但不会

(\ W +)\ W * $

工作?

答案 3 :(得分:0)

此正则表达式匹配一行中的最后一个单词:

\w+$

RegexBuddy提供此代码供Oracle使用:

DECLARE
        match VARCHAR2(255);
BEGIN
        match := REGEXP_SUBSTR(subject, '[[:alnum:]]_+$', 1, 1, 'c');
END;

答案 4 :(得分:0)

这留下了标点符号,但得到了最后的单词

with datam as (
SELECT 'abc asdb.' A FROM DUAL UNION
select 'ipso factum' a from dual union
select 'ipso factum' a from dual union
SELECT 'ipso factum2' A FROM DUAL UNION
SELECT 'ipso factum!' A FROM DUAL UNION
SELECT 'ipso factum  !' A FROM DUAL UNION
SELECT 'ipso factum/**//*/?.?' A FROM DUAL UNION
SELECT 'ipso factum  ...??!?!**' A FROM DUAL UNION
select 'ipso factum ..d.../.>' a from dual 

)
SELECT a,
--REGEXP_SUBSTR(A, '[[:alnum:]]_+$', 1, 1, 'c') , /** these are the other examples*/
--REGEXP_SUBSTR(A, '\S+$') ,  /** these are the other examples*/
regexp_substr(a, '[a-zA-Z]+[^a-zA-Z]*$')  

from datam