本文内容来自YashanDB官网,原文内容请见 https://doc.yashandb.com/yashandb/23.3/zh/%E5%BC%80%E5%8F%91%...

YashanDB的正则表达式实现兼容与Perl相同的语法和语义,此外也支持Unicode正则表达式规范。

Note: “UTF8支持”表示:当数据库服务端字符集为UTF8时,对于除ASCII外的UTF8字符(如中文等)的支持情况。 此外,若数据库服务端采用其他编码格式,其匹配规则都遵循ASCII编码字符匹配规则。 以下规则对于ASCII编码字符均适用。

元字符:


表1-1:元字符(非出现在字符类中)

符号描述UTF8支持
\通用转义字符(有多种用途)支持
^字符串(或行,在多行模式下)的开始支持
$字符串(或行,在多行模式下)的结束支持
.匹配除换行符以外的任何字符(默认)支持
[字符类开始标志支持
]字符类结束标志支持
备用分支的启动支持
(子模式或控件谓词开始标志支持
)子模式或控件谓词结束标志支持
*出现0次或多次(greedy)支持
+出现1次或多次(possessive)支持
?出现0次或1次(lazy)支持
{重复引用符的开始标志支持
}重复引用符的结束标志支持

表1-2:元字符(出现在字符类中)

符号描述UTF8支持
\通用的转义字符支持
^该类取反,但只对第一个字符生效支持
-指示字符范围支持
[POSIX字符类开始标志(如果后面跟着POSIX语法)支持
]POSIX字符类结束标志支持

匹配方式:


表2-1:单一匹配

符号描述UTF8支持
.匹配非换行符的任何字符支持
x单个字符x支持
[字符类]匹配“字符类”中的一个字符,“字符类”见后面的说明支持
[^字符类]匹配“字符类”外的一个字符,“字符类”见后面的说明支持
(xxx)匹配xxx,将内部表达式标记为子表达式支持
\小写字母Perl标记匹配“Perl字符类”中的一个字符,“Perl字符类”见后面的说明支持
\大写字母Perl标记匹配“Perl字符类”外的一个字符,“Perl字符类”见后面的说明支持
\p{xx}匹配“Unicode类“(普通类+脚本类)中的一个字符,“Unicode类”见后面的说明支持
\P{xx}匹配“Unicode类“(普通类+脚本类)外的一个字符,“Unicode类”见后面的说明支持
\pxx匹配“Unicode类“(仅普通类)中的一个字符,“Unicode类”见后面的说明支持
\Pxx匹配“Unicode类“(仅普通类)外的一个字符,“Unicode类”见后面的说明支持

表2-2:复合匹配

符号描述UTF8支持
xy匹配xy(x后面跟随y)支持
xy匹配x或y(优先匹配x)支持

表2-3:重复匹配

符号描述UTF8支持
x?x,零次或一次(greedy)支持
x?+x,零次或一次(possessive)支持
x??x,零次或一次(lazy)支持
x*x,零次或多次(greedy)支持
x*+x,零次或多次(possessive)支持
x*?x,零次或多次(lazy)支持
x+x,一次或多次(greedy)支持
x++x,一次或多次(possessive)支持
x+?x,一次或多次(lazy)支持
x{n}x,恰好n次(greedy)支持
x{n,m}x,至少n次,但是不超过m次(greedy)支持
x{n,m}+x,至少n次,但是不超过m次(possessive)支持
x{n,m}?x,至少n次,但是不超过m次(lazy)支持
x{n,}x,至少n次(greedy)支持
x{n,}+x,至少n次(possessive)支持
x{n,}?x,至少n次(lazy)支持

匹配位置:


表3-1:匹配位置

指定一个条件必须在一个特定的点匹配,不消耗任何字符的字符串。

符号描述UTF8支持
^匹配字符串开始--
$匹配字符串结束--
\b匹配单词边界--
\B匹配非单词边界--
\A匹配字符串开始--
\Z匹配字符串结束,也匹配字符串结尾的换行符之前--
\z匹配字符串结束--
\G匹配字符串中的第一个匹配位置--

转义字符:


表4-1:转义字符

转义字符描述UTF8支持
\aalarm字符(hex 07)--
\cx控制字符--
\d反向引用表达式(d是介于1和9之间的阿拉伯数字),匹配出现在'('和')'之间的子表达式--
\eescape字符(hex 1B)--
\f换页字符(hex 0C)--
\n换行字符(hex 0A)--
\r回车字符(hex 0D)--
\t制表字符(hex 09)--
\0dd八进制数dd--
\ddd八进制数ddd(或者反向引用的序号)--
\o{ddd..}八进制数ddd..--
\xhh十六进制数hh--
\x{hh..}十六进制数hh..--
\\字符\--
\^字符^--
\$字符$--
\.字符.--
\*字符*--
\+字符+--
\?字符?--
\{字符{--
\}字符}--
\(字符(--
\)字符)--
\[字符[--
\]字符]--
\ 字符 --

字符类:


表5-1:字符类汇总

一般字符类的使用方式为[...],POSIX字符类的使用方式为[[:xxx:]]

符号描述UTF8支持
[...]指定与列表中表示的任何表达式匹配的字符(字符之间是"或"的意思,例如[12]匹配1或2)支持
[^...]指定与列表外表示的任何表达式匹配的字符支持
[x-y]范围(可用于十六进制字符,包含首尾字符)支持
[[:xxx:]]POSIX字符类--
[[:^xxx:]]非POSIX字符类--
[\字母]Perl字符类支持
[p{xx}]Unicode类(普通类+脚本类)支持
[pxx]Unicode类(仅普通类)支持

表5-2:POSIX字符类

POSIX字符类描述UTF8支持
alnum字母数字(相当于[0-9A-Za-z])--
alpha字母(相当于[A-Za-z])--
asciiASCII字符集(相当于[\x00-\x7F])--
blank空白占位符(相当于[\t])--
cntrl控制字符(相当于[\x00-\x1F\x7F])--
digit数字(相当于[0-9])--
graph图形字符(相当于[!-~])--
lower小写字母(相当于[a-z])--
print可打印字符(相当于[-~],相当于[[:graph:]])--
punct标点符号(相当于[!-/:-@[-\`{-~])--
space空白字符(相当于[\t\n\v\f\r])--
upper大写字母(相当于[A-Z])--
word单词字符(相当于[0-9A-Za-z])--
xdigit16进制字符(相当于[0-9A-Fa-f])--

表5-3:Perl字符类

Perl字符类描述UTF8支持
\C一个代码单元,建议尽量避免(即使在UTF-8模式下)--
\d十进制数字(相当于[0-9])--
\D非十进制数字支持
\h水平空白字符--
\H非水平空白字符支持
\N非换行符支持
\s空格符(相当于[\t\n\f\r ])--
\S非空格符支持
\v垂直空白字符--
\V非垂直空白字符支持
\w单词字符(相当于[0-9A-Za-z])--
\W非单词字符支持
\R换行符--
\XUnicode扩展的字母簇支持

表5-4:Unicode类(普通类)

\p和\P属性描述UTF8支持
C其他(Other)支持
Cc控制字符(Control)支持
Cf格式字符(Format)支持
Cn未赋值字符(Unassigned)支持
Co私人使用区(Private use)支持
Cs代理区(Surrogate)支持
L字母字符(Letter)支持
Ll小写字母(Lower case letter)支持
Lm修饰字母(Modifier letter)支持
Lo其他字母(Other letter)支持
Lt首字母大写字母(Title case letter)支持
Lu大写字母(Upper case letter)支持
L&Ll、Lu或Lt支持
M标记(Mark)支持
Mc间距标记(Spacing mark)支持
Me嵌入标记(Enclosing mark)支持
Mn非间距标记(Non-spacing mark)支持
N数字(Number)支持
Nd十进制数字(Decimal number)支持
Nl字母数字(Letter number)支持
No其他数字(Other number)支持
P标点(Punctuation)支持
Pc连接标点(Connector punctuation)支持
Pd破折号(Dash punctuation)支持
Pe封闭标点,指括号(Close punctuation)支持
Pf最后的标点(Final punctuation)支持
Pi最初的标点(Initial punctuation)支持
Po其他标点(Other punctuation)支持
Ps开放的标点(Open punctuation)支持
S符号(Symbol)支持
Sc货币符号(Currency symbol)支持
Sk修饰符号(Modifier symbol)支持
Sm数学符号(Mathematical symbol)支持
So其他符号(Other symbol)支持
Xan属性L和N的并集支持
XpsPOSIX space:属性Z或tab、NL、VT、FF、CR支持
XspPerl space:属性Z或tab、NL、VT、FF、CR支持
Xuc统一命名字符:可以由通用字符名称表示支持
XwdPerl word:属性Xan或下划线支持
Z分隔符(Separator)支持
Zl行分隔符(Line separator)支持
Zp段落分隔符(Paragraph separator)支持
Zs空白分隔符(Space separator)支持

表5-5:Unicode类(脚本类)

注:支持UTF8。

Adlam, Ahom, Anatolian\_Hieroglyphs, Arabic, Armenian, Avestan, Balinese, Bamum, Bassa\_Vah, Batak, Bengali, Bhaiksuki, Bopomofo, Brahmi, Braille, Buginese, Buhid, Canadian\_Aboriginal, Carian, Caucasian\_Albanian, Chakma, Cham, Cherokee, Chorasmian, Common, Coptic, Cuneiform, Cypriot, Cypro\_Minoan, Cyrillic, Deseret, Devanagari, Dives\_Akuru, Dogra, Duployan, Egyptian\_Hieroglyphs, Elbasan, Elymaic, Ethiopic, Georgian, Glagolitic, Gothic, Grantha, Greek, Gujarati, Gunjala\_Gondi, Gurmukhi, Han, Hangul, Hanifi\_Rohingya, Hanunoo, Hatran, Hebrew, Hiragana, Imperial\_Aramaic, Inherited, Inscriptional\_Pahlavi, Inscriptional\_Parthian, Javanese, Kaithi, Kannada, Katakana, Kayah\_Li, Kharoshthi, Khitan\_Small\_Script, Khmer, Khojki, Khudawadi, Lao, Latin, Lepcha, Limbu, Linear\_A, Linear\_B, Lisu, Lycian, Lydian, Mahajani, Makasar, Malayalam, Mandaic, Manichaean, Marchen, Masaram\_Gondi, Medefaidrin, Meetei\_Mayek, Mende\_Kikakui, Meroitic\_Cursive, Meroitic\_Hieroglyphs, Miao, Modi, Mongolian, Mro, Multani, Myanmar, Nabataean, Nandinagari, New\_Tai\_Lue, Newa, Nko, Nushu, Nyakeng\_Puachue\_Hmong, Ogham, Ol\_Chiki, Old\_Hungarian, Old\_Italic, Old\_North\_Arabian, Old\_Permic, Old\_Persian, Old\_Sogdian, Old\_South\_Arabian, Old\_Turkic, Old\_Uyghur, Oriya, Osage, Osmanya, Pahawh\_Hmong, Palmyrene, Pau\_Cin\_Hau, Phags\_Pa, Phoenician, Psalter\_Pahlavi, Rejang, Runic, Samaritan, Saurashtra, Sharada, Shavian, Siddham, SignWriting, Sinhala, Sogdian, Sora\_Sompeng, Soyombo, Sundanese, Syloti\_Nagri, Syriac, Tagalog, Tagbanwa, Tai\_Le, Tai\_Tham, Tai\_Viet, Takri, Tamil, Tangsa, Tangut, Telugu, Thaana, Thai, Tibetan, Tifinagh, Tirhuta, Toto, Ugaritic, Vai, Vithkuqi, Wancho, Warang\_Citi, Yezidi, Yi, Zanabazar\_Square.

匹配控制类:


表6-1:匹配规则控制类

这些匹配控制选项仅生效于单次匹配,匹配结束会自动取消。

这些匹配选项的优先级高于regexp\_like、regexp\_count、regexp\_instr、regexp\_substr、regexp\_replace函数中match\_param表达式设置的相应属性,例如:

  • SELECT regexp_like('aa','(?i)AA','c') FROM DUAL;返回TRUE
  • SELECT regexp_like('aa','AA','c') FROM DUAL; 返回FALSE
  • pattern中的(?i)的优先级高于match\_param中的c

同时,匹配控制选项生效于后面模式的其余部分,举例:(a(?i)b)c

以上模式匹配abc或aBc,通过这种方式,可以使选项在模式的不同部分具有不同的设置。

匹配规则控制类描述
(?i)大小写不敏感
(?J)允许重复命名组
(?m)多行模式
(?n)禁用自动捕获
(?s).同时匹配换行符
(?U)默认匹配模式改为lazy
(?x)扩展:忽略除类之外的空白
(?xx)同(?x),但也忽略了类中的空格和TAB
(?-...)取消设置
(?^)取消imnsx选项

表6-2:匹配资源控制类

以下选项仅在模式的最开始处或使用类似语法的换行符或选项之一之后才能识别。可能会出现多个。

对于前三个,d是一个十进制数。

匹配资源控制类描述
(*LIMIT\_DEPTH=d)将回溯限制设置为d层(匹配使用系统栈进行回溯,此设置可以限制系统栈回溯层数)
(*LIMIT\_HEAP=d)将堆大小限制设置为d*1024字节(默认20000000)
(*LIMIT\_MATCH=d)将匹配限制设置为d(默认10000000)
(*NOTEMPTY)模式不匹配空串(举例:模式a?b?匹配主题开头的空字符串,在设置该选项后无效)
(*NOTEMPTY\_ATSTART)规则基本同上,不同的是它仅在第一个匹配位置锁定空字符串匹配
(*NO\_AUTO\_POSSESS)禁用“自动占有”,这是一种优化,例如,将a+b转换为a++b,以避免回溯到永远不会成功的a+。如果希望匹配函数执行完整的未优化搜索并运行所有标注,则可以设置此选项,但它主要用于测试目的。不建议使用。
(*NO\_DOTSTAR\_ANCHOR)禁用.*锚定优化,使用建议同(*NO\_AUTO\_POSSESS),不建议使用。
(*NO\_JIT)禁用JIT优化(YashanDB正则表达式引擎不支持JIT模式,该设置将失效)
(*NO\_START\_OPT)禁用没有开始匹配优化,使用建议同(*NO\_AUTO\_POSSESS),不建议使用。
(*UTF)为正在使用的匹配设置UTF模式
(*UCP)这个选项有两个效果。首先,它改变了PCRE2处理\B、\b、\D、\d、\S、\s、\W、\w和一些POSIX字符类的方式。默认情况下,只能识别ASCII字符,但如果设置PCRE2\_UCP,则使用Unicode属性对字符进行分类。如果设置PCRE2\_UCP,匹配它影响的项目需要更长的时间。PCRE2\_UCP的第二个影响是强制对代码点大于127的字符使用Unicode属性进行上/下大小写操作,即使未设置PCRE2\_UTF。

表6-3:换行符控制类

这些换行符控制类将改变匹配过程中对换行符的识别规则,默认换行符为LF,即hex 0A。

以下选项仅在模式的最开始处或使用类似语法的换行符或选项之一之后才能识别。仅限一个。

newline约定的选择不会影响\n或\r转义符的解释,也不会影响\R匹配的内容。这些有自己的独立约定。

换行符控制类描述
(*CR)仅回车符(hex 0D)
(*LF)仅换行符(hex 0A)(默认)
(*CRLF)回车符+换行符(hex 0D + hex 0A)
(*ANYCRLF)上边三项任其一
(*ANY)任何Unicode newline序列
(*NUL)NUL字符(二进制零)
(*BSR\_ANYCRLF)CR、LF或CRLF
(*BSR\_UNICODE)任何Unicode newline序列

组类:


表7-1:捕获组类

捕获组通常与反向引用和搭配使用,例如:

  1. 模式(?<leader>king|queen)\g{leader}匹配字符串kingking。 命名组leader匹配到king,之后\g{leader}反向引用匹配到的king。
  2. 模式(?<leader>king|queen)\g{leader}不匹配字符串kingqueen。

捕获组的序号按照模式中左括号的先后顺序排列。

注:在非UTF模式下,名称可能包含下划线、ASCII字母和数字;在UTF模式下,允许使用任何Unicode字母和Unicode十进制数字。 在这两种情况下,名称不得以数字开头。

捕获组类描述
(...)捕获组
(?<name>...)命名捕获组(Perl)
(?'name'...)命名捕获组(Perl)
(?P<name>...)命名捕获组(Python)
(?:...)非捕获组
(?...)非捕获组;重置的组号,捕获每个备选方案中的组

表7-2:原子组类

原子组类描述
(?>...)原子非捕获组
(*atomic:...)原子非捕获组

表7-3:注释组类

注释组类描述
(?#....)注释(不可嵌套)
#....注释(仅生效于match\_param设定包含"x"的情况下)

环视断言:


表8-1:前视和后视断言

前视断言可以控制匹配返回结果只包含匹配项的部分内容,其他断言类似,例如: 调用regexp\_substr函数匹配字符串beijing\_2022,可以使用含有前视断言的模式"beijing(?=\_[1-9]*)"使其只返回beijing。

积极前视断言、消极前视断言、积极后视断言、消极后视断言使用举例:

  1. 模式 \w(?=;)匹配任何单词后跟一个分号,但不包含这个分号
  2. 模式 \w(?!=;)匹配任何单词后跟一个非分号,但不包含这个非分号
  3. 模式 (?<=;)\w匹配分号后跟任何单词,但不包含这个单词
  4. 模式 (?<!;)\w匹配分号后跟任何非单词,但不包含这个非单词

注:后视断言的每个顶级分支必须具有固定的长度。

断言描述
(?=...)积极前视断言
(*pla:...)积极前视断言
(*positive\_lookahead:...)积极前视断言
(?!...)消极前视断言
(*nla:...)消极前视断言
(*negative\_lookahead:...)消极前视断言
(?<=...)积极后视断言
(*plb:...)积极后视断言
(*positive\_lookbehind:...)积极后视断言
(?<!...)消极后视断言
(*nlb:...)消极后视断言
(*negative\_lookbehind:...)消极后视断言

表8-2:非原子环视断言

断言描述
(?*...)非原子积极前视断言
(*napla:...)非原子积极前视断言
(*non\_atomic\_positive\_lookahead:...)非原子积极前视断言
(?<*...)非原子积极后视断言
(*naplb:...)非原子积极后视断言
(*non\_atomic\_positive\_lookbehind:...)非原子积极后视断言

运行脚本:


表9-1:运行脚本类

脚本类是一系列字符,这些字符都来自相同的Unicode脚本,如拉丁语或希腊语。 使用脚本类可用于检测看起来相同但来自不同脚本的字符的欺骗攻击。 字符串"paypal.com"是一个臭名昭著的例子,字母可能是拉丁文和西里尔文的混合体。 此模式确保在空格后的非空格序列中匹配的字符是拉丁语系:

\s+(?=\p{Latin})(*sr:\S+)

运行脚本类描述
(*script\_run:...)脚本运行,可被回溯到
(*sr:...)脚本运行,可被回溯到
(*atomic\_script\_run:...)原子脚本运行
(*asr:...)原子脚本运行

引用:


YashanDB的正则表达仅支持在模式内部进行反向引用,不支持在regexp\_replace函数的replace参数处使用。

表10-1:反向引用符

反向引用符描述
\n编号引用(可能不明确)
\gn编号引用
\g{n}编号引用
\g+n相对编号引用(扩展)
\g-n相对编号引用
\g{+n}相对编号引用(扩展)
\g{-n}相对编号引用
\k<name>编号引用(Perl)
\k'name'编号引用(Perl)
\g{name}编号引用(Perl)
\k{name}编号引用(.NET)
(?P=name)编号引用(Python)

表10-2:子例程引用符(可能递归)

子例程引用符描述
(?R)递归整个模式
(?n)按绝对数调用子例程
(?+n)按相对数调用子例程
(?-n)按相对数调用子例程
(?&name)按名称调用子例程(Perl)
(?P>name)按名称调用子例程(Python)
\g<name>按名称调用子例程(Oniguruma)
\g'name'按名称调用子例程(Oniguruma)
\g<n>按绝对数调用子例程(Oniguruma)
\g'n'按绝对数调用子例程(Oniguruma)
\g<+n>按相对编号调用子例程(扩展)
\g'+n'按相对编号调用子例程(扩展)
\g<-n>按相对编号调用子例程(扩展)
\g'-n'按相对编号调用子例程(扩展)

条件模式:


表11-1:条件模式调用

条件模式描述
(?(condition)yes-pattern)condition符合即使用yes模式匹配,失败不匹配
(?(condition)yes-patternno-pattern)condition符合即使用yes模式匹配,失败使用no模式匹配

表11-2:条件类

条件类描述
(?(n)绝对参考条件
(?(+n)相对参考条件
(?(-n)相对参考条件
(?(<name>)命名参考条件(Perl)
(?('name')命名参考条件(Perl)
(?(name)命名参考条件(已弃用)
(?(R)总体递归条件
(?(Rn)特定编号组递归条件
(?(R&name)特定的命名组递归条件
(?(DEFINE)定义组以供参考
(?(VERSION[>]=n.m)测试版本
(?(assert)断言条件

回溯控制:


表12-1:回溯控制符

所有回溯控制动词的格式可以是(*VERB:NAME),对于(*MARK),名称是必填的,对于其他名称是可选的。

注:

  1. 第四项-第八项表示仅当后续匹配失败导致回溯到达它们时,才执行对应操作。 它们都会迫使匹配失败,但它们在匹配后会发生什么情况上有所不同。 只有在模式未锚定的情况下,才会提前匹配点的起点。
  2. 在称为子例程的组中,这些动词之一的作用仅限于子例程调用。
回溯控制符描述
(*ACCEPT)强制成功匹配
(*FAIL)强制回溯;同义词(*F)
(*MARK:NAME)设置要传回的名称;同义词(*:NAME)
(*COMMIT)总体失败,起点不提前
(*PRUNE)前进到下一个起始字符
(*SKIP)前进到较早的(*MARK:NAME)的位置,如果没找到,则忽略(*SKIP)
(*SKIP:NAME)绝对参考条件
(*THEN)局部失败,返回到下一个替换项

标注:


表13-1:标注符

允许的字符串分隔符为“'”^%$(起始和结束的分隔符相同),起始分隔符{与结束分隔符匹配}。 要在字符串中对结束分隔符进行匹配,请重复输入它。

标注描述
(?C)标注(假定编号0)
(?Cn)标注数字数据n
(?C"text")带字符串数据的标注

YashanDB
1 声望0 粉丝

崖山数据库系统YashanDB是深圳计算科学研究院自主设计研发的新型数据库管理系统,融入原创的有界计算、近似计算、并行可扩展和跨模融合计算理论,可满足金融、政企、能源等关键行业对高性能、高并发及高安全性的...