我正在开发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"匹配,那么您必须以某种方式转义'
字符。