Oracle SQL 正则表达式 RegExp_SubStr End Of Line (chr(10) 在搜索文本中返回 null
Posted
技术标签:
【中文标题】Oracle SQL 正则表达式 RegExp_SubStr End Of Line (chr(10) 在搜索文本中返回 null【英文标题】:Oracle SQL Regular Expression RegExp_SubStr End Of Line (chr(10) in search text returns null 【发布时间】:2020-03-03 06:03:18 【问题描述】:我正在尝试使用 Oracle 正则表达式获取文本的特定部分。如果文本中没有行尾字符(chr(10)
),我会得到我想要的。但如果有行尾字符,则返回 null。您可以在下面查看示例 sql 代码。
SELECT RegExp_SubStr('TEXT_BEGIN Line 1 Line 2 TEXT_END', 'TEXT_BEGIN(.+)TEXT_END', 1, 1, NULL, 1) FROM dual;
返回
Line 1 Line 2
带有行尾字符。
SELECT RegExp_SubStr('TEXT_BEGIN Line 1' || chr(10) || 'Line 2 TEXT_END', 'TEXT_BEGIN(.+)TEXT_END', 1, 1, NULL, 1) FROM dual;
返回
NULL
将文本中的行尾字符转换为特殊字符(例如## CHR10 ##
在SubStr
之前然后在SubStr
之后返回)可能是一种解决方案。但我想要一个没有 hack 的简单解决方案。
【问题讨论】:
显然你的模式将不匹配,因为它们是两行不同的行,一行以TEXT_BEGIN
开头,下一行以Line 2
开头,而模式仅搜索以TEXT_BEGIN
开头的字符串
@Fact 这对我来说并不明显,但请参阅下面的数学专家的回答。
@Tim Biegeleisen 模式 DID NOTmatch 所以它返回 Null..不确定你对我的评论的解释。
【参考方案1】:
默认情况下,点不匹配换行符。
regexp_substr
的第五个参数(在您的示例中为 NULL
)用于一些修饰符。其中之一是'n'
以允许点匹配换行符。
所以 - 这真的很简单:将第五个参数从 NULL
更改为 'n'
。
【讨论】:
以上是关于Oracle SQL 正则表达式 RegExp_SubStr End Of Line (chr(10) 在搜索文本中返回 null的主要内容,如果未能解决你的问题,请参考以下文章
带正则表达式的参数化 SQL、ORACLE 与 SQL Server
在 oracle 中使用正则表达式查找 POBOX - PL/SQL