我试图定义一些模式以使用REGEXP_SUBSTR从Oracle检索数据,但是我缺少删除用于查找数据的定界符的方法。
我需要一个模式来检索两个定界符之间的任何类型的数据,但结果中不包括那些定界符。
让我们分享一些例子:
字符串:
Lorem ipsum dolor坐下,安全,结束就医,-sed-做eiusmod tempor indicidunt ut laboure et dolore excp 123456 magna aliqua 789003。
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;
答案 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
编写)。这样可以确保我们仅匹配完整的单词excp
和magna
,而不匹配那些单词作为其他单词的子字符串(例如magnate
)。
答案 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()
如果找不到模式,则返回原始字符串。