Regex 带有连字符的正则表达式给出不同的结果

Regex 带有连字符的正则表达式给出不同的结果,regex,oracle,Regex,Oracle,我想替换所有不匹配的字符 在a-z范围内 在A-Z范围内 空间 连字符 强调 开口( 结束) 我到达了这个正则表达式 [^0-9A-Za-z\-\(\)] 当我在字符串(Hi)上测试这个时,我得到了结果(Hi) 当我在Oracle查询中使用相同的表达式时 SELECT regexp_replace('(Hi-There)','[^0-9A-Za-z\-\(\)]', '') FROM dual 我只得到(这里)缺少的连字符 出了什么问题?试着把它放在末尾: SELECT regexp_re

我想替换所有不匹配的字符

在a-z范围内

在A-Z范围内

空间

连字符

强调

开口(

结束)

我到达了这个正则表达式

[^0-9A-Za-z\-\(\)]
当我在字符串(Hi)上测试这个时,我得到了结果(Hi)

当我在Oracle查询中使用相同的表达式时

SELECT regexp_replace('(Hi-There)','[^0-9A-Za-z\-\(\)]', '')  FROM dual
我只得到(这里)缺少的连字符

出了什么问题?

试着把它放在末尾:

SELECT regexp_replace('(Hi-There)','[^0-9A-Za-z\(\)\-]', '')  FROM dual
此外,正如@DavidFaber和@hwnd所说,您也不需要逃避
()
,因此:

SELECT regexp_replace('(Hi-There)','[^0-9A-Za-z()-]', '')  FROM dual

你说得对

我刚试过,它对我有效,但我很想知道它为什么有效。因为
-
就像是介于\和\之间的范围运算符。因此它将与\not
-
匹配。您可以使用
[\-\]
检查此项。这将只匹配\不匹配连字符。看起来Oracle的正则表达式实现已损坏。当连字符转义时,不应将其视为范围指示符。Oracle使用POSIX ERE。另外,如果
-
位于字符类的末尾(或开头!),则无需转义。您可以将其编写为
[^a-zA-Z0-9()-]
是此问题的更复杂版本。