Regex 带有连字符的正则表达式给出不同的结果
我想替换所有不匹配的字符 在a-z范围内 在A-Z范围内 空间 连字符 强调 开口( 结束) 我到达了这个正则表达式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
[^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()-]
是此问题的更复杂版本。