Oracle数据库,在其他两个字符串之间提取字符串beeing

时间:2019-01-31 16:41:27

标签: regex oracle regexp-substr

我需要一个与regexp_substr()结合使用的正则表达式,才能使该单词位于其他两个指定单词之间。

示例

source_string => 'First Middle Last'

    substring varchar2(100);
    substring := regexp_substr(source_string, 'First (.*) Last'); <=== 

这不起作用:(。

dbms_output.put_line(substring) ===>输出应为:'Middle'

我知道它看起来很简单并且说实话,一开始我也这么认为。 但是现在花了大约3个小时寻找解决方案之后,我放弃了...

3 个答案:

答案 0 :(得分:2)

它不起作用,因为正在寻找文字字符串'First''Last'。假设字符串并非全部以'First'开头,则需要找到另一种表示它们的方法。您已经通过将'Middle'表示为(.*)

来完成此操作

接下来的一点是,您需要提取一个子表达式(括号中的部分),这是REGEXP_SUBSTR()的第六个参数。

如果将它们放在一起,则以下内容将为您提供所需的内容:

regexp_substr(source_string, '.*\s(.*)\s.*', 1, 1, 'i', 1)

其工作示例:

SQL> select regexp_substr('first middle last', '.*\s(.*)\s.*', 1, 1, 'i', 1)
  2    from dual;

REGEXP
------
middle

您还可以使用在线正则表达式测试器来验证'middle' is the only captured group

取决于实际源字符串的外观,您可能不希望精确搜索空格,而是使用\Wa non-word character)。

如果您恰好希望有三个单词,我也会将您的表达式锚定在字符串的开头和结尾:^.*\s(.*)\s.*$

答案 1 :(得分:1)

如果源字符串始终看起来相同,即由3个元素(单词)组成,那么这样一个简单的正则表达式就可以完成工作:

SQL> with t (str) as
  2    (select 'First Middle Last' from dual)
  3  select regexp_substr(str, '\w+', 1, 2) result from t;

RESULT
------
Middle

SQL>

答案 2 :(得分:0)

(\S*)模式可以与regexp_replaceregexp_substr一起使用,如下所示以获取中间单词:

with t(str) as
(
 select 'First Middle Last' from dual
)
select regexp_substr(trim(regexp_replace(str, '^(\S*)', '')),'(\S*)') 
    as "Result String"
  from t;

Result String
-------------
Middle    

第一步First,第二步Last的单词被修剪。

或者,更直接地,您可以使用regexp_replace作为

with t(str) as
(
 select 'First Middle Last' from dual
)
select regexp_replace(str,'(.*) (.*) (.*)','\2') 
    as "Result String"
  from t;

Result String
-------------
Middle