我希望在oracle正则表达式查询中有一个非正则表达式组。意思是我想匹配所有与正则表达式组不匹配的模式
我的字符串:
trainingFeatures
使用的模式匹配:
"G,1 = G"
Current_Output:
([[:alpha:]]+\,*[[:digit:]]*)
问题:不是模式。匹配所有不匹配的表达式
"grouped(G,-1) = grouped(G)"
上述表达式的必需输出:
([[:alpha:]]+\,*[[:digit:]]*)
其他因素:"G,-1 group(=) G"
可以是任何运营商"="
代码:
"(+-*=)"
如果能帮助在正则表达式中得出Not,我将不胜感激。
答案 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
此外,如果您不希望操作员之前或之后的模式是特定的,而只希望对操作员进行分组,则可以使用:
REGEXP_REPLACE(s,'([^\+-\*=]+)(\+|-|\*|=)([^\+-\*=]+)'
,'\1group(\2)\3')