这个生产代码中的Oracle正则表达式匹配是什么?

时间:2016-01-22 15:51:29

标签: sql regex oracle

这是生产中的代码:

dynamic_sql := q'[ with cte as
               select user_id,
                      user_name
               from   user_table
               where  regexp_like (bizz_buzz,'^[^Z][^Y6]]' || q'[') AND
                      user_code not in ('A','E','I')
               order by 1]';
  1. 从头开始搜索bizz_buzz
  2. 匹配任何一个非Z
  3. 的字符
  4. 匹配任何非Y6
  5. 的两个字符
  6. ''是什么?在6?
  7. 之后
  8. 然后是什么?

3 个答案:

答案 0 :(得分:4)

我认为StackOverflow的格式化导致了答案中的一些混乱。 Oracle有一个字符串文字q'[...]'的语法,这意味着...部分将被完全解释为原样;所以例如它可以包括单引号,而不必单独转义每一个。

但是这里的代码格式化并不理解该语法,因此它将每个单引号视为字符串分隔符,这使得结果看起来与Oracle真正看到它的方式不同。

表达式将两个这样的字符串文字连接在一起。 (我不确定为什么 - 看起来可以将它写成单个字符串文字而没有任何问题。)正如另一个答案/注释所指出的,生成的SQL字符串实际上是:

with cte as
           select user_id,
                  user_name
           from   user_table
           where  regexp_like (bizz_buzz,'^[^Z][^Y6]') AND
                  user_code not in ('A','E','I')
           order by 1

另外在另一个答案中指出,正则表达式的[^Y6]部分匹配单个字符,而不是两个字符。所以这个表达式应该只匹配任何第一个字符不是'Z'且第二个字符既不是'Y'也不是'6'的字符串。

答案 1 :(得分:2)

当不在夫妻中]意味着......嗯......本身:

^[^Z][^Y6]]/

^ assert position at start of the string
[^Z] match a single character not present in the list below
    Z the literal character Z (case sensitive)
[^Y6] match a single character not present in the list below
    Y6 a single character in the list Y6 literally (case sensitive)
] matches the character ] literally
  1. 从头开始搜索bizz_buzz
  2. 匹配任何一个非Z
  3. 的字符
  4. 匹配任何两个一个非Y或6
  5. 的字符
  6. 6之后的']'是什么?这是一个]

答案 2 :(得分:1)

我担心我必须在此发帖,因为评论部分不适合所需的格式。在上面的编辑显示整个语句之后,我运行它来查看字符串最终是什么:

select q'[ with cte as
               select user_id,
                      user_name
               from   user_table
               where  regexp_like (bizz_buzz,'^[^Z][^Y6]]' || q'[') AND
                      user_code not in ('A','E','I')
               order by 1]' txt
from dual; 

它最终产生了这个:

with cte as
               select user_id,
                      user_name
               from   user_table
               where  regexp_like (bizz_buzz,'^[^Z][^Y6]') AND
                      user_code not in ('A','E','I')
               order by 1

现在很明显,正则表达式末尾的右括号和引号属于第一个备用引号字符串而不是正则表达式。这是连接2个备用引用字符串,这有点令人困惑,因为它确实看起来像正则表达式的一部分。如果有的话,你正在学习评论对你背后的穷人的重要性!完成后,请相应地对此进行评论。甚至包括这篇文章的链接。