Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 最后一句话:在SQL中(可能使用正则表达式?)_Regex_Algorithm_Oracle_String_Plsql - Fatal编程技术网

Regex 最后一句话:在SQL中(可能使用正则表达式?)

Regex 最后一句话:在SQL中(可能使用正则表达式?),regex,algorithm,oracle,string,plsql,Regex,Algorithm,Oracle,String,Plsql,我需要在Oracle SQL(10gR2)中完成此操作。但我想,我更愿意直截了当地说,任何好的、有效的算法都是好的 给定一行(或一个包含一个或多个单词的句子,英语),你如何找到句子的最后一个单词 下面是我在SQL中尝试的内容。但是,我希望看到一种有效的方法 select reverse(substr(reverse(&p_word_in) , 0 , instr(reverse(&

我需要在Oracle SQL(10gR2)中完成此操作。但我想,我更愿意直截了当地说,任何好的、有效的算法都是好的

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

下面是我在SQL中尝试的内容。但是,我希望看到一种有效的方法

select reverse(substr(reverse(&p_word_in)
                         , 0
                         , instr(reverse(&p_word_in), ' ')
                         )
                  )
      from dual;
其思想是反转字符串,找到第一个出现的空间,检索子字符串并反转字符串。效率高吗?正则表达式可用吗?我使用的是Oracle 10g R2。但我不介意在其他编程语言中看到任何尝试,如果需要,我也不介意编写PL/SQL函数

更新: 杰弗里·坎普给出了一个极好的答案。这很好用

答复
此正则表达式与行上的最后一个单词匹配:

\w+$
RegexBuddy提供了以下代码供Oracle使用:

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

不确定它的性能如何,但这应该可以做到:

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

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

(\w+)\w*$


工作?

这将保留标点符号,但得到最后一个单词

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

我认为INSTR/SUBSTR更简单:

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

好的。一个相关的问题:如果句子末尾有句点或其他字符,这将不起作用,compie也是如此。@Jesse:是的,也许每个非空白字符都是更好的解决方案从dual中选择regexp_substr(&p_word_in,“[^\s]+$”;或者从dual中选择regexp_substr(&p_word_in'(\w+)[^\w]*$);两者都应该起作用。第一个会抓住句点,第二个不应该(我不确定在oracle中括号是如何处理的。)@Jesse:记录在案,
[^\s]
\s
相同,
[^\w]
\w
相同。)我收到错误:Msg 195,第15级,状态10,第2行“INSTR”不是可识别的内置函数名。@AnjanKant,该错误表示您没有使用Oracle。
WITH q AS (SELECT 'abc def ghi' AS sentence FROM DUAL)
SELECT SUBSTR(sentence, INSTR(sentence,' ',-1) + 1)
FROM q;