PL/SQL 正则表达式验证如何从 '



我正在开发fullName验证函数,可以使用的示例有:

John Deep

JohnDeep

John Deep

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

^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:遇到符号"]"时。。。

如何解决此问题?

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

你的模式有点多余,你可以使用一个可选的组:来消除交替

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

但是,您不能在Oracle正则表达式中使用Unicode属性类。您可以使用POSIX[:alpha:]字符类而不是p{L}来匹配任何Unicode字母,并拼写出p{Pd}([u002Du058Au05BEu1400u1806u2010u2011u2012u2013u2014u2015u2E17u2E1Au2E3Au2E3Bu2E40u301Cu3030u30A0uFE31uFE32uFE58uFE63uFF0D](和p{Zs}([u0020u3000u1680u2000u2001u2002u2003u2004u2005u2006u2008u2009u200Au205Fu00A0u2007u202F](Unicode属性类。您还可以考虑使用POSIX[:space:]/[:blank:]字符类而不是p{Zs},因为p{Zs}匹配所有水平空白BUT选项卡字符。

转换后的图案看起来像

'^[[:alpha:]]+([-[:alpha:]' || unistr('58A') || unistr('5BE') || 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('009') || 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('0A0') || unistr('2007') || unistr('202F') || ' '']*[[:alpha:]]+)?$'

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

'^[[:alpha:]]+([-[:alpha:][:blank:]' || unistr('58A') || unistr('5BE') || 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演示(1表示存在匹配(。

regexp_like(str, '^p{L}+[p{L}p{Pd}p{Zs}']*p{L}+$|^p{L}+$')

我认为这是p{Zs}和]*\p 之间的第二个单引号

编辑:当我在网上做regex时,我也喜欢:regexTester或regex101还有一些有用的正则表达式的例子。

如果您给出的示例是唯一应该匹配的,则使用:
regexp_like(str, '^p{L}+[p{L}p{Pd}p{Zs}]*p{L}+$|^p{L}+$')

但是,如果您希望正则表达式与"Jhono'Deep"匹配,那么您必须以某种方式转义'字符。

最新更新