在一组REGEXP字符值中包含新行



是否有可能在一组被列入白名单的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:]-]')

匹配只包含白名单字符的字符串。请注意,rn不是有效的Oracle字符规范,所以我使用[:space:]字符类来匹配它们(以及任何其他空格)。

最新更新