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