我需要在某些定界符之间使用regexp_substr的几种情况下使用的通用模式

时间:2019-02-07 14:50:25

标签: regex oracle substr regexp-substr

我试图定义一些模式以使用REGEXP_SUBSTR从Oracle检索数据,但是我缺少删除用于查找数据的定界符的方法。

我需要一个模式来检索两个定界符之间的任何类型的数据,但结果中不包括那些定界符。

让我们分享一些例子:

字符串:

Lorem ipsum dolor坐下,安全,结束就医,-sed-做eiusmod tempor indicidunt ut laboure et dolore excp 123456 magna aliqua 789003。

如何使用regexp_substr返回类似的数据?

1 - consectetur (without space and without comma)
2 - adipiscing (without words 'end', 'elit' and without space character)
3 - sed (without '-' character)
4 - labore (between space, using part of word in a sentence like lab*)
5 - 123456 (between 'excp ' and ' magna', without return space character)
6 - 789003 (without '.' dot character)

with example as
 (select 'Lorem ipsum dolor sit amet, consectetur, end adipiscing elit, - 
sed- do eiusmod tempor incididunt ut labore et dolore excp 123456 magna 
aliqua 789003.' as string from dual) 
    select string,
        regexp_substr(string,'(amet\, ).*(\, end)')          as val1,  -- 
Expect ==> 'consectetur'
        regexp_substr(string,'(end ).+(elit)')               as val2,  -- 
Expect ==> 'adipiscing'
        regexp_substr(string,'(-).*(-)')                     as val3,  -- 
Expect ==> 'sed'
        regexp_substr(string,'(ut ).*( et)')                 as val4,  -- 
Expect ==> 'dolore'
       regexp_substr(string,'excp +[[:digit:]]+( magna)')   as val5,  -- 
Expect ==> '123456'
        regexp_substr(string,'(\S)+[[:digit:]]+(\.)')        as val6   -- 
Expect ==> '789003'
  from  example;

2 个答案:

答案 0 :(得分:1)

这里可能更有用/功能更强大的Oracle regex函数是REGEXP_REPLACE,因为它支持捕获组。这意味着我们可以编写一个模式,其中可能包含我们实际上不想在最终结果中看到的部分。

我将专注于您的问题之一:

5 - 123456 (between 'excp ' and ' magna', without return space character)

我们可以使用以下正则表达式模式:

.*(^|\s)excp (\d+) magna(\s|$).*

然后,我们可以替换为第二个捕获组,即数字123456

SELECT
    REGEXP_REPLACE(text, '.*(^|\s)excp (\d+) magna(\s|$).*', '\2') AS output
FROM yourTable;

(^|\s)(\s|$)充当有效的单词边界(通常在其他正则表达式中使用\b编写)。这样可以确保我们仅匹配完整的单词excpmagna,而不匹配那些单词作为其他单词的子字符串(例如magnate)。

Demo

答案 1 :(得分:0)

为了争辩,List<String> stepargs = new ArrayList<String>(); stepargs.add("spark-submit"); stepargs.add("--class"); stepargs.add(mainClass); stepargs.add("--deploy-mode"); stepargs.add("cluster"); stepargs.add("--master"); stepargs.add("yarn"); stepargs.add("--files"); stepargs.add(files); stepargs.add("--jars"); stepargs.add(jars); stepargs.add("--properties-file"); stepargs.add(confFileName); stepargs.add(jar); Iterator<String> itr = args.iterator(); while (itr.hasNext()) { String arg = itr.next(); if (arg.equals("--arg")) { stepargs.add(itr.next()); } } 在这样调用时确实支持捕获组(可能已经在11g中更新了吗?):

REGEXP_SUBSTR()

参数的意思是从位置1开始,查找正则表达式字符串模式的第一个匹配项,不带修饰符(不过,对于不区分大小写的用户可以使用'i'),然后返回第一个捕获组。它将按预期返回“ consectetur”。

需要注意的一个重要区别是,regexp_substr(string,'amet, (.*), end', 1, 1, NULL, 1) as val1, -- Expect ==> 'consectetur' 如果找不到模式,则返回NULL,而REGEXP_SUBSTR()如果找不到模式,则返回原始字符串。