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

Oracle Database, extract string beeing between two other strings

我需要一个与 regexp_substr() 组合的正则表达式,它会给我两个其他指定单词之间的单词。

示例

source_string => 'First Middle Last'

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

这行不通:(.

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

我知道这看起来很简单,老实说,一开始我也是这么想的。 但是现在在花了大约 3 小时寻找解决方案后我放弃了...

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

来完成此操作

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

如果你把这些放在一起,那么下面就是你想要的:

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

根据您的实际源字符串的样子,您可能不想搜索精确的空格,而是使用 \W (a non-word character)。

如果您正好需要三个词,我还会将您的表达式锚定到字符串的开头和结尾:^.*\s(.*)\s.*$

(\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,'(.*) (.*) (.*)','') 
    as "Result String"
  from t;

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

如果源字符串看起来总是一样的,即由 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>