【问题标题】:Including new line in a set of REGEXP character values在一组 REGEXP 字符值中包含新行
【发布时间】:2021-10-23 20:08:22
【问题描述】:

是否可以在一组列入白名单的 REGEXP 中包含新行?

我一直在尝试在这个集合中的任何地方进行测试,但我的输出总是无效

换行

\r\n

代码

DECLARE
  l_value varchar2(4000) := 'Stack

Overflow';
BEGIN
  IF REGEXP_LIKE(l_value,'^[a-zA-Z0-9$"/\?!%.,:;’\r\n()-]*$') THEN
    dbms_output.put_line('valid');
  ELSE
    dbms_output.put_line('invalid');  
  END IF;
END;
/

输出应该是

Valid

我们将不胜感激。谢谢。

【问题讨论】:

    标签: regex oracle plsql


    【解决方案1】:

    如果你想在你的正则表达式中匹配换行符,你需要添加'm' 选项。 From the docs:

    'm' 将源字符串视为多行。 Oracle 将 ^ 和 $ 分别解释为源字符串中任何位置的任何行的开始和结束,而不仅仅是整个源字符串的开始或结束。如果省略此参数,则 Oracle 将源字符串视为单行。

    所以:

    REGEXP_LIKE(l_value,'^[a-zA-Z0-9$"/\?!%.,:;’\r\n()-]*$', 'm')
    

    编辑:您可能想使用 REGEXP_SUBSTR 来调试您的正则表达式并查看它们匹配的内容。在这种情况下,这个:

    select regexp_substr('Stack
    Overflow ++', '^[a-zA-Z0-9$"/\?!%.,:;’\r\n()-]*$', 1, 1, 'm')
    from dual;
    

    匹配Stack,因为$ 匹配它找到的行的第一端。 (正则表达式是“贪婪的”)

    听起来您想查找仅包含列入白名单的值的字符串。但是这个正则表达式匹配在某些行的开头和结尾之间包含白名单值的字符串。

    相反,我认为你想要这样的东西:

    NOT REGEXP_LIKE(l_value,'[^a-zA-Z0-9$"/\?!%.,:;’()[:space:]-]')
    

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

    【讨论】:

    • 谢谢,但是当我尝试将输入更改为 l_value varchar2(4000) := 'Stack Overflow ++' 时,输出是有效的,但它应该是 invalid 因为 + 号或任何其他不在集合中的特殊字符.
    • 我明白了,你想要一些不同的东西。更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2020-08-17
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-30
    • 2013-08-16
    • 1970-01-01
    相关资源
    最近更新 更多