【问题标题】:PL/SQL regex validation how to escape from 'PL/SQL 正则表达式验证如何从 '
【发布时间】:2020-06-02 06:01:45
【问题描述】:

我正在开发一个全名验证功能,可以使用的示例是:

约翰·迪普

约翰迪普

约翰-迪普

我想使用这个正则表达式:

^\p{L}+[\p{L}\p{Pd}\p{Zs}']*\p{L}+$|^\p{L}+$

我的验证函数是:

 create or replace FUNCTION is_valid_fullName (str IN VARCHAR2) RETURN VARCHAR2 AS
        bln BOOLEAN;
    begin       
     if regexp_like(str, '^\p{L}+[\p{L}\p{Pd}\p{Zs}']*\p{L}+$|^\p{L}+$') then

            return 1;
      else 
        return 0;
     end if;
     end;

但是我的语法有问题。

PLS-00103:遇到符号“]”时...

我该如何解决这个问题?

【问题讨论】:

    标签: sql regex oracle plsql


    【解决方案1】:

    要在字符串中输入单引号,请将其加倍。

    您的模式有点多余,您可以使用可选组摆脱交替:

    ^\p{L}+([\p{L}\p{Pd}\p{Zs}']*\p{L}+)?$
           ^                           ^^  
    

    但是,您不能在 Oracle 正则表达式中使用 Unicode 属性类。您可以做的是使用 POSIX [:alpha:] 字符类而不是 \p{L} 来匹配任何 Unicode 字母并拼出 \p{Pd} ([\u002D\u058A\u05BE\u1400\u1806\u2010\u2011\u2012\u2013\u2014\u2015\u2E17\u2E1A\u2E3A\u2E3B\u2E40\u301C\u3030\u30A0\uFE31\uFE32\uFE58\uFE63\uFF0D]) 和 \p{Zs} ([\u0020\u3000\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2008\u2009\u200A\u205F\u00A0\u2007\u202F] ) Unicode 属性类。您也可以考虑使用 POSIX [:space:] / [:blank:] 字符类而不是 \p{Zs},因为 \p{Zs} 匹配所有水平空格制表符。

    转换后的模式看起来像

    '^[[:alpha:]]+([-[:alpha:]' || unistr('\058A') || unistr('\05BE') || unistr('\1400') || unistr('\1806') || unistr('\2010') || unistr('\2011') || unistr('\2012') || unistr('\2013') || unistr('\2014') || unistr('\2015') || unistr('\2E17') || unistr('\2E1A') || unistr('\2E3A') || unistr('\2E3B') || unistr('\2E40') || unistr('\301C') || unistr('\3030') || unistr('\30A0') || unistr('\FE31') || unistr('\FE32') || unistr('\FE58') || unistr('\FE63') || unistr('\FF0D') || unistr('\0009') || unistr('\3000') || unistr('\1680') || unistr('\2000') || unistr('\2001') || unistr('\2002') || unistr('\2003') || unistr('\2004') || unistr('\2005') || unistr('\2006') || unistr('\2008') || unistr('\2009') || unistr('\200A') || unistr('\205F') || unistr('\00A0') || unistr('\2007') || unistr('\202F') || ' '']*[[:alpha:]]+)?$'
    

    或者,如果您使用[:blank:]

    '^[[:alpha:]]+([-[:alpha:][:blank:]' || unistr('\058A') || unistr('\05BE') || unistr('\1400') || unistr('\1806') || unistr('\2010') || unistr('\2011') || unistr('\2012') || unistr('\2013') || unistr('\2014') || unistr('\2015') || unistr('\2E17') || unistr('\2E1A') || unistr('\2E3A') || unistr('\2E3B') || unistr('\2E40') || unistr('\301C') || unistr('\3030') || unistr('\30A0') || unistr('\FE31') || unistr('\FE32') || unistr('\FE58') || unistr('\FE63') || unistr('\FF0D') || ' '']*[[:alpha:]]+)?$'
    

    查看regex demo1 表示匹配)。

    【讨论】:

      【解决方案2】:

      如果您提供的示例是唯一应该匹配的内容,请使用:
      regexp_like(str, '^\p{L}+[\p{L}\p{Pd}\p{Zs}]*\p{L}+$|^\p{L}+$')

      但是,如果您希望正则表达式匹配“Jhon o' Deep”,那么您必须以某种方式转义该 ' 字符。

      【讨论】:

        【解决方案3】:
        regexp_like(str, '^\p{L}+[\p{L}\p{Pd}\p{Zs}']*\p{L}+$|^\p{L}+$')
        

        我认为这是 p{Zs} 和 ]*\p

        之间的第二个单引号

        编辑: 做正则表达式时,我也喜欢在线:regexTesterregex101 还有一些有用的正则表达式的例子。

        【讨论】:

        • Oracle 正则表达式不支持 Unicode 属性类。
        猜你喜欢
        • 1970-01-01
        • 2014-07-27
        • 2019-06-10
        • 2015-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多