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_replace
和 regexp_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>
我需要一个与 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_replace
和 regexp_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>