我需要一个与regexp_substr()结合使用的正则表达式,才能使该单词位于其他两个指定单词之间。
示例:
source_string => 'First Middle Last'
substring varchar2(100);
substring := regexp_substr(source_string, 'First (.*) Last'); <===
这不起作用:(。
dbms_output.put_line(substring)
===>输出应为:'Middle'
我知道它看起来很简单并且说实话,一开始我也这么认为。 但是现在花了大约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。
取决于实际源字符串的外观,您可能不希望精确搜索空格,而是使用\W
(a 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_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,'(.*) (.*) (.*)','\2')
as "Result String"
from t;
Result String
-------------
Middle