是否有可能在一组被列入白名单的REGEXP中包含新行?
我一直在试着测试这个集合中的每一个地方,但我的输出总是无效
新行
rn
DECLARE
l_value varchar2(4000) := 'Stack
Overflow';
BEGIN
IF REGEXP_LIKE(l_value,'^[a-zA-Z0-9$"/?!%.,:;’rn()-]*$') THEN
dbms_output.put_line('valid');
ELSE
dbms_output.put_line('invalid');
END IF;
END;
/
输出应为
Valid
如有任何意见,将不胜感激。谢谢。
如果您想在regexp中匹配换行符,则需要添加'm'
选项。来自文档:
'm'将源字符串视为多行。Oracle将^和$分别解释为源字符串中任意行的开始和结束,而不仅仅是整个源字符串的开始或结束。如果省略此参数,则Oracle将源字符串视为单行。
:
REGEXP_LIKE(l_value,'^[a-zA-Z0-9$"/?!%.,:;’rn()-]*$', 'm')
编辑:你可能想使用REGEXP_SUBSTR来调试你的正则表达式,看看他们匹配什么。在本例中,为:
select regexp_substr('Stack
Overflow ++', '^[a-zA-Z0-9$"/?!%.,:;’rn()-]*$', 1, 1, 'm')
from dual;
匹配Stack
,因为$
匹配它找到的一行的第一个结尾。(reexp是"贪婪的")
听起来你想找到只包含白名单值的字符串。但是这个regexp匹配的字符串在某些行开始和结束之间包含白名单值。
相反,我认为你应该这样写:
NOT REGEXP_LIKE(l_value,'[^a-zA-Z0-9$"/?!%.,:;’()[:space:]-]')
匹配只包含白名单字符的字符串。请注意,r
和n
不是有效的Oracle字符规范,所以我使用[:space:]
字符类来匹配它们(以及任何其他空格)。