0

我只需要允许一组字符,即 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^[^.^{^}^!^@^#^$^%^*^(^)^_^=^+^|^\^{^}^"^''^;^:^?^/^,^-^ ]' ); 
4

3 回答 3

0

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

于 2018-12-04T11:54:45.993 回答
0

正如我认为您所期望的那样,您的模式中括号表达式内的额外^符号不是否定的;只有^括号内的第一个这样做。

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

要包含文字-,它必须是括号中的第一件事或最后一件事;来自文档

要在方括号表达式中指定右方括号 (]),请将其放在列表的第一个位置(如果有的话,在初始的抑扬符 (^) 之后)。

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

因此,当您需要同时执行这两项操作时,请将连字符放在最后;您可以将模式更改为:

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

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

'[^]A-Za-z0-9[.{}!@#$%*()_=+|\{}"'';:?/, '||chr(10)||chr(11)||chr(13)||'-]'
于 2018-12-04T11:55:50.037 回答
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, '\', '/')

于 2018-12-04T12:33:25.773 回答