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的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL 劈开字符串

带正则表达式的参数化 SQL、ORACLE 与 SQL Server

在 oracle 中使用正则表达式查找 POBOX - PL/SQL

sql Oracle正则表达式

(Oracle) SQL 中的正则表达式将日期/时间拆分为单独的日期和时间列

PL/SQL Oracle 正则表达式对于零的出现不起作用