Sql 如何在ORACLE正则表达式中对字符类进行例外?
我需要从Oracle DB中提取所有包含非标准格式或无效字符序列的客户名称,例如:(空格和标点重复)。为此,我使用了类似REGEXP_的(Customer_Name,'[[:space:[:punct:]]{2,})表达式 但是我需要允许一些例外情况,比如一些空格和标点重复是可以接受的。试图在“NOT”运算符后插入它们(请参见我的代码) 我正在使用下面的代码:Sql 如何在ORACLE正则表达式中对字符类进行例外?,sql,regex,oracle,Sql,Regex,Oracle,我需要从Oracle DB中提取所有包含非标准格式或无效字符序列的客户名称,例如:(空格和标点重复)。为此,我使用了类似REGEXP_的(Customer_Name,'[[:space:[:punct:]]{2,})表达式 但是我需要允许一些例外情况,比如一些空格和标点重复是可以接受的。试图在“NOT”运算符后插入它们(请参见我的代码) 我正在使用下面的代码: WITH T (id, col) AS ( SELECT 1, 'GEORGE AND SON'FROM DUAL UNION AL
WITH T (id, col) AS (
SELECT 1, 'GEORGE AND SON'FROM DUAL UNION ALL
SELECT 2, 'GEORGE P. SON'FROM DUAL UNION ALL
SELECT 3, 'GEORGE P . SON'FROM DUAL UNION ALL
SELECT 4, 'GEORGE - P. SON'FROM DUAL UNION ALL
SELECT 5, 'GEORGE - P . SON'FROM DUAL UNION ALL
SELECT 6, 'GEORGE- P. SON'FROM DUAL UNION ALL
SELECT 7, 'GEORGE P, SON'FROM DUAL UNION ALL
SELECT 8, 'GEORGE P , SON'FROM DUAL UNION ALL
SELECT 9, 'GEORGE - AUTO . SON'FROM DUAL UNION ALL
SELECT 10, 'GEORGE P. & SON' FROM DUAL UNION ALL
SELECT 11, 'GEORGE P.&SON' FROM DUAL)
SELECT *
FROM T
WHERE
REGEXP_LIKE(col, '[[:space:][:punct:]]{2,}') AND
--Exclusions:
NOT (REGEXP_LIKE(col, '[[:upper:]]+\. \w') OR
REGEXP_LIKE(col, '[[:upper:]]+ \& \w') OR
REGEXP_LIKE(col, '[[:upper:]]+\, \w') OR
INSTR(col, ' - ') > 0
)
ORDER BY id
;
我的问题是,这个正则表达式只带来Id(3、8、10和11),但也应该带来(5、6和9),如下所述:
5-'乔治-p。儿子:有个例外“-”但是“无效(spc和点重复)
6-“GEORGE-p.SON”:有例外“p.”,但“-”无效(spc和点重复)
9-'乔治-汽车。儿子:有个例外“-”但是“无效(spc和点重复)
我需要知道,我如何对我的generalRegex'[[:space:[:punct:]]{2,}字符类进行例外。
在我的代码中,当常规“规则”和“异常”都存在于同一个字符串中时,这个正则表达式不会像预期的那样工作,就像Id(5、6和9)的情况一样
非常感谢您的帮助。我昨天告诉过您这是不可能的,请不要每天都重复同样的问题。是的,Wiktor,谢谢您的回答。但有些人可以有一个我们都看不到的解决方案,至少现在……可能还有另一个解决方案,但您的需求仅与regex相关,您希望限制一个通用模式。这需要Oracle正则表达式引擎不支持的环顾。因此,您可能会在这里使用几个正则表达式,但肯定不会使用单个正则表达式解决方案。我没有看到一个正则表达式解决方案,因为没有。。。除非Oracle SQL将切换到其他正则表达式引擎,就像MySQL一样,它现在使用从v.8开始的ICU正则表达式。如果有人(我知道)知道如何使用正则表达式,那么它就是@Wiktor。如果他说不可能,那么——在我看来——我相信这实际上是可能的,但根本不可能。是的,这里可能确实存在一些解决办法,我会试试我的手。