gpt4 book ai didi

sql - Oracle - 需要提取给定字符串之间的文本

转载 作者:行者123 更新时间:2023-12-02 07:52:13 25 4
gpt4 key购买 nike

示例 - 需要提取“Begin begin”和“End end”之间的所有内容。我尝试过这种方法:

with phrases as (
select 'stackoverflow is awesome. Begin beginHello, World!End end It has everything!' as phrase
from dual
)
select regexp_replace(phrase
, '([[:print:]]+Begin begin)([[:print:]]+)(End end[[:print:]]+)', '\2')
from phrases
;

结果:你好,世界!

但是,如果我的文本包含换行符,则会失败。有什么提示可以解决此问题以允许提取还包含新行的文本吗?

[编辑]它是如何失败的:

with phrases as (
select 'stackoverflow is awesome. Begin beginHello,
World!End end It has everything!' as phrase
from dual
)
select regexp_replace(phrase
, '([[:print:]]+Begin begin)([[:print:]]+)(End end[[:print:]]+)', '\2')
from phrases
;

结果:

stackoverflow is awesome. Begin beginHello, World!End end It has everything!

应该是:

Hello,
World!

[编辑]

另一个问题。让我们看看这个示例:

WITH phrases AS (
SELECT 'stackoverflow is awesome. Begin beginHello,
World!End end It has everything!End endTESTESTESTES' AS phrase
FROM dual
)
SELECT REGEXP_REPLACE(phrase, '.+Begin begin(.+)End end.+', '\1', 1, 1, 'n')
FROM phrases;

结果:

Hello,
World!End end It has everything!

所以它匹配最后出现的结束字符串,这不是我想要的。子字符串应该被提取到我的标签第一次出现的位置,所以结果应该是:

Hello,
World!

标签字符串第一次出现之后的所有内容都应该被忽略。有什么想法吗?

最佳答案

我不太熟悉 POSIX [[:print:]] 字符类,但我使用通配符 . 使您的查询正常运行。您需要在REGEXP_REPLACE()中指定n匹配参数,以便.可以匹配换行符:

WITH phrases AS (
SELECT 'stackoverflow is awesome. Begin beginHello,
World!End end It has everything!' AS phrase
FROM dual
)
SELECT REGEXP_REPLACE(phrase, '.+Begin begin(.+)End end.+', '\1', 1, 1, 'n')
FROM phrases;

我使用了 \1 反向引用,因为我认为不需要从正则表达式中捕获其他组。 如果分隔符之前或之后没有任何内容,最好使用 * 量词(而不是 +)。如果如果您想捕获所有组,则可以使用以下命令:

WITH phrases AS (
SELECT 'stackoverflow is awesome. Begin beginHello,
World!End end It has everything!' AS phrase
FROM dual
)
SELECT REGEXP_REPLACE(phrase, '(.+Begin begin)(.+)(End end.+)', '\2', 1, 1, 'n')
FROM phrases;

更新 - 仅供引用,我用 [[:print:]] 进行了测试,但它不起作用。这并不奇怪,因为 [[:print:]] 应该匹配可打印字符。它不匹配 ASCII 值低于 32(空格)的任何内容。您需要使用..

更新 #2 - 每次更新问题 - 我认为正则表达式不会按照您想要的方式工作。将惰性量词添加到 (.+) 没有任何效果,并且 Oracle 正则表达式没有先行功能。您可以执行以下操作,其中之一是使用 INSTR()SUBSTR():

WITH phrases AS (
SELECT 'stackoverflow is awesome. Begin beginHello,
World!End end It has everything!End endTESTTESTTEST' AS phrase
FROM dual
)
SELECT SUBSTR(phrase, str_start, str_end - str_start) FROM (
SELECT INSTR(phrase, 'Begin begin') + LENGTH('Begin begin') AS str_start
, INSTR(phrase, 'End end') AS str_end, phrase
FROM phrases
);

另一种方法是将 INSTR()SUBSTR() 与正则表达式结合起来:

WITH phrases AS (
SELECT 'stackoverflow is awesome. Begin beginHello,
World!End end It has everything!End endTESTTESTTEST' AS phrase
FROM dual
)
SELECT REGEXP_REPLACE(SUBSTR(phrase, 1, INSTR(phrase, 'End end') + LENGTH('End end')), '.+Begin begin(.+)End end.+', '\1', 1, 1, 'n')
FROM phrases;

关于sql - Oracle - 需要提取给定字符串之间的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28674778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com