写点什么

YashanDB RegExp 语法

作者:YashanDB
  • 2025-04-01
    广东
  • 本文字数:2825 字

    阅读完需:约 9 分钟

本文内容来自 YashanDB 官网,原文内容请见 https://doc.yashandb.com/yashandb/23.3/zh/%E5%BC%80%E5%8F%91%E6%89%8B%E5%86%8C/SQL%E5%8F%82%E8%80%83%E6%89%8B%E5%86%8C/%E9%80%9A%E7%94%A8SQL%E8%AF%AD%E6%B3%95/RegExp.html


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


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

元字符:


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


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


匹配方式:


# 表 2-1:单一匹配


# 表 2-2:复合匹配


# 表 2-3:重复匹配


匹配位置:


# 表 3-1:匹配位置

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



转义字符:


# 表 4-1:转义字符




字符类:


# 表 5-1:字符类汇总

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



# 表 5-2:POSIX 字符类


# 表 5-3:Perl 字符类


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



# 表 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,通过这种方式,可以使选项在模式的不同部分具有不同的设置。



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

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


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



# 表 6-3:换行符控制类

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


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


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



组类:


# 表 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 十进制数字。 在这两种情况下,名称不得以数字开头。


# 表 7-2:原子组类


# 表 7-3:注释组类


环视断言:


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

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


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


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

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

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

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


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



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


运行脚本:


# 表 9-1:运行脚本类

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


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



引用:



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

# 表 10-1:反向引用符


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


条件模式:


# 表 11-1:条件模式调用


# 表 11-2:条件类


回溯控制:


# 表 12-1:回溯控制符

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


注:


  1. 第四项-第八项表示仅当后续匹配失败导致回溯到达它们时,才执行对应操作。 它们都会迫使匹配失败,但它们在匹配后会发生什么情况上有所不同。 只有在模式未锚定的情况下,才会提前匹配点的起点。

  2. 在称为子例程的组中,这些动词之一的作用仅限于子例程调用。


标注:


# 表 13-1:标注符

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


发布于: 3 小时前阅读数: 7
用户头像

YashanDB

关注

全自研国产新型大数据管理系统 2022-02-15 加入

还未添加个人简介

评论

发布
暂无评论
YashanDB RegExp语法_数据库_YashanDB_InfoQ写作社区