不是oracle正则表达式组

时间:2018-11-21 20:54:48

标签: oracle regex-negation

我希望在oracle正则表达式查询中有一个非正则表达式组。意思是我想匹配所有与正则表达式组不匹配的模式

我的字符串:

trainingFeatures

使用的模式匹配:

"G,1 = G"

Current_Output:

([[:alpha:]]+\,*[[:digit:]]*)

问题:不是模式。匹配所有不匹配的表达式

"grouped(G,-1) = grouped(G)"

上述表达式的必需输出:

([[:alpha:]]+\,*[[:digit:]]*)

其他因素:"G,-1 group(=) G" 可以是任何运营商"="

代码:

"(+-*=)"

如果能帮助在正则表达式中得出Not,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

您可以尝试以下模式:

REGEXP_REPLACE(s,'([a-zA-Z]+,[0-9]+\s+)([^a-zA-Z0-9])(\s+[a-zA-Z]+)','\1group(\2)\3')

为了简单起见,我没有使用过Posix regex,而是将[a-zA-Z]用作字母,将[0-9]用作数字。 \s*?表示零个或多个空间。

[^a-zA-Z0-9]尝试匹配您的运算符,但它可能与有效的运算符不同,因此,如果您确定所有可能的运算符,都可以将它们显式指定为(\+|-|\*|=)

我分别将左手操作数,运算符和右手运算符分组为(\1,(\2)和(\3)组。

SQL>
SQL> with t(s) AS
  2  (
  3    SELECT 'G,1=G'      FROM  DUAL UNION ALL
  4    SELECT 'AB,13 + H'  FROM  DUAL UNION ALL
  5    SELECT 'BCD,1 * ID' FROM  DUAL
  6  )
  7  select s,REGEXP_REPLACE(s,'([a-zA-Z]+,[0-9]+\s*?)([^a-zA-Z0-9])(\s*?[a-zA-Z]+)'
  8                           ,'\1group(\2)\3')
  9  as m
 10  FROM t;

S            M
--           --
G,1=G        G,1group(=)G
AB,13 + H    AB,13 group(+) H
BCD,1 * ID   BCD,1 group(*) ID

Demo

此外,如果您不希望操作员之前或之后的模式是特定的,而只希望对操作员进行分组,则可以使用:

REGEXP_REPLACE(s,'([^\+-\*=]+)(\+|-|\*|=)([^\+-\*=]+)' ,'\1group(\2)\3')