特殊字符Oracle REGEXP

时间:2018-12-04 11:23:05

标签: oracle regexp-like

我只需要允许一组字符,即 从a到z A到Z 0到9。 !@#$%*()_ = + | [] {}“'';:?/.,-

但是当我在下面的查询中添加破折号(-)时,它不起作用,请尽快为我提供帮助。

  SELECT :p_string FROM dual
   WHERE NOT REGEXP_LIKE (translate(:p_string,chr(10)||chr(11)||chr(13), ' '),'[^]^A-Z^a-z^0-9^[^.^{^}^!^@^#^$^%^*^(^)^_^=^+^|^\^{^}^"^''^;^:^?^/^,^-^ ]' ); 

3 个答案:

答案 0 :(得分:0)

[.-。]在此查询上可以正常工作。

答案 1 :(得分:0)

我认为,模式中括号表达式中多余的^符号不是负数;只有括号内的第一个^可以做到。

除了允许在您似乎不希望使用实际的抑扬符号时将其匹配之外,导致出现的主要问题是,最终^-^被视为一个范围。

要包含文字-,它必须是方括号中的第一或最后一个; from the docs

  

要在方括号表达式中指定右方括号(]),请将其放在列表中的第一位(如果有首个抑音符(^),则在其后)。

     

要在方括号表达式中指定连字符,请将其放在列表中的首位(如果有首个抑音符(^)之后),列表中的最后一位或在范围表达式中作为结束范围点。

因此,您需要同时做两个,使连字符最后;您可以将模式更改为:

'[^]A-Za-z0-9[.{}!@#$%*()_=+|\{}"'';:?/, -]'

您也可以通过在模式中也包括那些特殊字符来跳过tralsnate步骤:

'[^]A-Za-z0-9[.{}!@#$%*()_=+|\{}"'';:?/, '||chr(10)||chr(11)||chr(13)||'-]'

答案 2 :(得分:0)

好像您只需要允许(7位)ASCII字符,但~^除外

在这种情况下,我会这样尝试:

WHERE CONVERT(p_string, 'US7ASCII') = p_string
   AND NOT REGEXP_LIKE(p_string, '~|\^')

您也可以使用CONVERT(p_string, 'US7ASCII') = p_string代替ASCIISTR(REPLACE(p_string, '\', '/')) = REPLACE(p_string, '\', '/')