【发布时间】:2015-04-24 20:02:56
【问题描述】:
示例 - 需要提取“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 很棒。开始 beginHello, World!End end 它有 一切!
应该是:
你好,
世界!
[编辑]
另一个问题。让我们看看这个示例:
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;
结果:
你好,
World!End end 它拥有一切!
所以它匹配最后出现的结束字符串,这不是我想要的。子字符串应该被提取到我的标签的第一次出现,所以结果应该是:
你好,
世界!
第一次出现标签字符串之后的所有内容都应该被忽略。有什么想法吗?
【问题讨论】:
-
它是如何失败的?你可以在哪里输入
\n并打破它? -
我更新了我的问题
-
有趣的问题。我无法找出解决方案,但我正在关注谁会这样做。 :)
-
虽然 Stephan 和 David Faber 有一个很好的解决方案,但值得看看其他人如何解决一般的换行符变体,因为它与 Oracle 中的正则表达式有关。我发现在这里查看@APC 是如何做到这一点的,stackoverflow.com/questions/16407135/...
标签: sql regex oracle plsql substring