Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Oracle数据库,提取其他两个字符串之间的字符串_Regex_Oracle_Regexp Substr - Fatal编程技术网

Regex Oracle数据库,提取其他两个字符串之间的字符串

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

我需要一个与regexp_substr()结合的regexp,它会给我一个介于其他两个指定单词之间的单词

示例

source_string=>
'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,谢谢你!