Oracle REGEXP_LIKE没有按预期工作

时间:2016-10-06 20:12:19

标签: sql regex oracle

我在Oracle SQL中测试了一个正则表达式,发现了一些我无法理解的东西:

-- NO MATCH
SELECT 1 FROM DUAL WHERE REGEXP_LIKE ('Professor Frank', '(^|\s)Prof[^\s]*(\s|$)');

以上不匹配,而以下匹配:

-- MATCH
SELECT 1 FROM DUAL WHERE REGEXP_LIKE ('Professor Frank', '(^|\s)Prof\S*(\s|$)'); 

在其他正则表达式中,它会像\bProf[^\s]*\b\bProf\S*\b一样,并且具有类似的结果。注意:Oracle SQL正则表达式没有\b或字边界。

问题:为什么不在{@ 1}}和[^\s]*以相同的方式在Oracle SQL中工作?

我注意到如果我删除了\S*,那么第一个正则表达式就会匹配。

1 个答案:

答案 0 :(得分:4)

在Oracle正则表达式中,\s确实是空格的转义序列,但不是匹配的字符集(即[.....][^....],用于排除一个字符) 。在匹配的字符集中,只有两个字符具有特殊含义,-表示范围,]表示关闭集合枚举。他们无法逃脱;如果在匹配集中需要,]必须始终是开场[之后的第一个字符(它是关闭]代表自己作为角色的唯一位置,并且并不表示匹配集的结束),-必须是第一个或最后一个(最好将它始终保留到匹配集的末尾) - 在其他任何地方它都被视为范围标记。要包含(或排除,如果使用[^.....]语法)空格,只需在匹配集中键入实际物理空间。

编辑:我上面所说的并不完全正确。匹配集中还有另一个特殊字符,即^。如果它在第一个位置使用,则表示"匹配任何其他角色。"在任何其他位置,它代表自己。例如,'[^^]'将匹配除^以外的任何单个字符(第一个^具有特殊含义,第二个代表自身)。并且,如果第一个字符是](具有SPECIAL含义),则括号^代表括号中的第二个字符。也就是说,为了匹配除]以外的任何单个字符,我们可以使用匹配模式'[^]]'