Regex Oracle数据库,提取其他两个字符串之间的字符串
我需要一个与regexp_substr()结合的regexp,它会给我一个介于其他两个指定单词之间的单词 示例: source_string=>Regex Oracle数据库,提取其他两个字符串之间的字符串,regex,oracle,regexp-substr,Regex,Oracle,Regexp Substr,我需要一个与regexp_substr()结合的regexp,它会给我一个介于其他两个指定单词之间的单词 示例: source_string=>'First Middle Last' substring varchar2(100); substring := regexp_substr(source_string, 'First (.*) Last'); <=== 子串varchar2(100); 子字符串:=regexp_substr(源字符串,'First(.*)L
'First Middle Last'
substring varchar2(100);
substring := regexp_substr(source_string, 'First (.*) Last'); <===
子串varchar2(100);
子字符串:=regexp_substr(源字符串,'First(.*)Last') 它不起作用,因为正在查找文本字符串'First'
和'Last'
。假设字符串并非都是从字面上开始的“First”
,您需要找到另一种方式来表示它们。通过将'Middle'
表示为(.*)
下一点是,您需要提取一个子表达式(括号中的部分),这是的第6个参数
如果您将这些放在一起,那么以下内容将满足您的需求:
regexp_substr(source_string, '.*\s(.*)\s.*', 1, 1, 'i', 1)
it工作的一个例子:
SQL> select regexp_substr('first middle last', '.*\s(.*)\s.*', 1, 1, 'i', 1)
2 from dual;
REGEXP
------
middle
您还可以使用在线正则表达式测试仪来验证这一点
根据实际源字符串的外观,您可能不希望搜索确切的空格,而是使用\W
()
如果您只需要三个单词,我也会将您的表达式锚定到字符串的开头和结尾:^.*\s(.*\s.*$
它不起作用,因为正在查找文本字符串'First'
和'Last'
。假设字符串并非都是从字面上开始的“First”
,您需要找到另一种方式来表示它们。通过将'Middle'
表示为(.*)
下一点是,您需要提取一个子表达式(括号中的部分),这是的第6个参数
如果您将这些放在一起,那么以下内容将满足您的需求:
regexp_substr(source_string, '.*\s(.*)\s.*', 1, 1, 'i', 1)
it工作的一个例子:
SQL> select regexp_substr('first middle last', '.*\s(.*)\s.*', 1, 1, 'i', 1)
2 from dual;
REGEXP
------
middle
您还可以使用在线正则表达式测试仪来验证这一点
根据实际源字符串的外观,您可能不希望搜索确切的空格,而是使用\W
()
如果您只需要三个单词,我也会将您的表达式锚定到字符串的开头和结尾:^.*\s(.*\s.*$
(\s*)
模式可以与regexp\u replace
和regexp\u 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
在第一步中,第一个
,在第二步中,最后一个字被修剪
或者,您可以更直接地使用regexp\u replace
作为
with t(str) as
(
select 'First Middle Last' from dual
)
select regexp_replace(str,'(.*) (.*) (.*)','\2')
as "Result String"
from t;
Result String
-------------
Middle
(\S*)
模式可与regexp\u replace
和regexp\u 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
在第一步中,第一个,在第二步中,最后一个字被修剪
或者,您可以更直接地使用regexp\u replace
作为
with t(str) as
(
select 'First Middle Last' from dual
)
select regexp_replace(str,'(.*) (.*) (.*)','\2')
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>
如果源字符串看起来总是一样的,即由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>
那么,在您的示例中,您是在非常特定的单词“First”和“Last”之间寻找一个“单词”(无论定义如何)?如果“First”和“Last”之间有两三个单词呢?“First”或“Last”是否可以在输入字符串中出现多次?(如果是,那么期望的结果是什么?)另外:为什么
regexp_replace()
是问题陈述的一部分,而不是一个可能的解决方案的一部分?你必须使用正则表达式,而忽略所有不使用正则表达式的解决方案吗?我相信这三个词只会出现一次。天哪,当我提到regexp\u substr时,我注意到我写了regexp\u replace。对不起。我不必使用正则表达式。如果你有更好的想法,你会非常欢迎:DSo,在你的例子中,你正在寻找一个“单词”(无论定义如何)介于非常具体的单词“First”和“Last”之间?如果“First”和“Last”之间有两三个单词呢?“First”或“Last”是否可以在输入字符串中出现多次?(如果是,那么期望的结果是什么?)另外:为什么regexp_replace()
是问题陈述的一部分,而不是一个可能的解决方案的一部分?你必须使用正则表达式,而忽略所有不使用正则表达式的解决方案吗?我相信这三个词只会出现一次。天哪,当我提到regexp\u substr时,我注意到我写了regexp\u replace。对不起。我不必使用正则表达式。如果你有更好的想法,我会非常欢迎你的:这正是我想要的!你帮我节省了很多时间,谢谢!哦,事实上,我会有一个很长的文本,我会寻找这三个确切的单词,我不会只知道中间的一个。我的目标是找出它是什么,你的例子就是这样做的!再次感谢您!这正是我要找的!你帮我节省了很多时间,谢谢!哦,事实上,我会有一个很长的文本,我会寻找这三个确切的单词,我不会只知道中间的一个。我的目标是找出它是什么,你的例子就是这样做的!再次感谢您!非常感谢。您的regexp可以很好地处理三个单词,但由于我不够具体,我忘了提到实际文本会更长,而这三个单词只是其中的一部分。但是无论如何,非常好的regexp,谢谢你!非常感谢。您的regexp可以很好地处理三个单词,但由于我不够具体,我忘了提到实际文本会更长,而这三个单词只是其中的一部分。但是无论如何,非常好的regexp,谢谢你!