用于空字符的Oracle正则表达式

时间:2016-05-26 03:25:27

标签: sql regex oracle oracle11g

在Oracle 11g中,如何在正则表达式中检测空字符(chr(0))?

我希望以下条件评估为true,但它不会:

select case when regexp_like (chr(0), '\0') then 1 else 0 end from dual;

我的特定用例需要检测varchar2列中的空字符模式:

 select * from my_table where NOT regexp_like (my_column, '^[\s\0]+$');

4 个答案:

答案 0 :(得分:1)

您可以使用[:cntrl:]字符类。

SELECT
  CASE
    WHEN regexp_like (chr(0), '[[:cntrl:]]')
    THEN 1
    ELSE 0
  END control_chr
FROM dual;

CONTROL_CHR
-----------
1

答案 1 :(得分:1)

我为这个问题做了一些研究。 chr(0)是一个在任何地方造成混乱的事情。

我首先创建了一个表,在其中插入了一个带有chr(0)的字符串,并尝试使用regexp_like找到它。

CREATE TABLE t1(col1 VARCHAR2(10));
INSERT INTO t1 VALUES('01234' || chr(0) || '5678');
SELECT CASE WHEN REGEXP_LIKE(col1,CHR(0)) THEN 1 ELSE 0 END op,col1, dump(col1)  FROM t1;

输出低于 -

op      col1       dump(col1)
----    -----      -------------------------------------------------
1       01234      Typ=1 Len=10: 48,49,50,51,52,0,53,54,55,56

正如您所见,转储显示实际上chr(0)在那里,虽然在屏幕上显示字符串时,该工具将chr(0)视为空终止符并且不显示其余的。因此,似乎regexp_like 实际上在字符串中找到chr(0)的匹配项。

但令我沮丧的是,我发现即使是没有chr(0)的字符串也会返回相同的结果。

DELETE FROM t1;
INSERT INTO t1 VALUES('0123456789');
SELECT CASE WHEN REGEXP_LIKE(col1,CHR(0)) THEN 1 ELSE 0 END op,col1, dump(col1)  FROM t1;

op      col1           dump(col1)
-----   -------        ----------------------------------------------------
1       0123456789     Typ=1 Len=10: 48,49,50,51,52,53,54,55,56,57

所以有一些东西可以处理chr(0)。我发布了以下问题并得到了同样的解释。 chr(0)是一个零长度的字符串,每当我们试图在字符串中找到它时,它显然会在任何地方找到它,实际上找不到它。

似乎无法在字符串中找到chr(0)。请参阅MTO的回复。

CHR(0) in REGEXP_LIKE

答案 2 :(得分:1)

您可以LIKEINSTR使用CHR(0)来检测它,但REGEXP_LIKE无效,因为它会特别处理CHR(0)

create table t1 (col1 varchar2(10));

insert into t1 values ('01234'||chr(0)||'5678');

insert into t1 values ('01234X5678');

select case when col1 like '%'||chr(0)||'%' then 1 else 0 end r, col1, dump(col1) from t1;

select case when instr(col1,chr(0)) > 0 then 1 else 0 end r, col1, dump(col1) from t1;

上述两个查询都显示以下结果:

enter image description here

select case when regexp_like(col1,chr(0)) then 1 else 0 end r, col1, dump(col1) from t1;

这给出了以下结果:

enter image description here

您需要小心,因为有些客户在遇到CHR(0)时会停止阅读字符串。例如,当我尝试从SQL Developer的查询结果网格中复制并粘贴时,它就在那时停止了。

答案 3 :(得分:1)

似乎无法仅识别Oracle正则表达式中的空字符。 Oracle's Regular Expression reference documentation表示支持正则表达式,并且没有提及支持标识空字符的元字符或表达式(尽管支持其他标准元字符的子集)。我的测试证实了这一点,因为在这个帖子中有其他人执行了后续测试。

虽然这个问题的答案是不可能的,但其他一些答案可能有助于满足其他人的需求。用例。特别是,请参阅此answer建议使用[[:cntrl:]]类。这将识别正则表达式中的空字符,尽管它也会匹配类中的其他字符。