【问题标题】:Oracle Database, extract string beeing between two other stringsOracle数据库,在其他两个字符串之间提取字符串beeing
【发布时间】:2019-06-25 04:37:48
【问题描述】:

我需要一个与 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”和“Last”之间有两三个词怎么办? 'First' 或 'Last' 是否可以在输入字符串中多次出现? (如果是这样,期望的结果是什么?)另外:为什么regexp_replace() 是问题陈述的一部分,而不是一个可能的解决方案的一部分?您是否不得不使用正则表达式并忽略所有不使用正则表达式的解决方案?
  • 我确定这三个词只会出现一次。我刚刚注意到当我提到 regexp_substr... 时我写了 regexp_replace。对不起。我不必使用正则表达式。如果您有更好的想法如何去做,我们会非常欢迎:D

标签: regex oracle regexp-substr


【解决方案1】:

它不起作用,因为正在寻找文字字符串 '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.*$

【讨论】:

  • 这正是我想要的!你为我节省了很多时间,谢谢!哦,实际上我会有一个很长的文本,我会寻找这三个确切的词,而我不会只知道中间那个。我的目标是找出它是什么,你的例子就是这样做的!再次感谢您!
【解决方案2】:

(\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 as

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

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

【讨论】:

  • 谢谢!您的正则表达式适用于三个单词,但因为我不够具体,我忘了提到实际文本会更长,而这三个单词只是其中的一部分。但无论如何,很棒的正则表达式,谢谢!
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多