SQL Anywhere正则表达式语法与示例

2020-04-07 14:02:08王振洲
非捕获块 该语法在功能上就等效于 pattern,是为实现兼容性而提供。

例如,在 'bb' REGEXP '(?:b*)b' 中,(?:b*) 匹配(并消耗)bb。但是,与所属关系局部子表达式不同,bb 中的最后一个 b 会被放弃,以允许整个匹配成功(即,允许与在非捕获块的外部找到的 b 匹配)。

同样,'a(?:bc|b)c' 匹配 abcc 和 abc。在匹配 abc 时,bc 中最后面的 c 会发生回溯,以便可以使用组外的 c 来使匹配成功。

(?#text) 用于注释。text 的内容会被忽略。

正则表达式示例

下表显示正则表达式的使用示例。所有示例都适用于 REGEXP,部分示例也适用于 SIMILAR TO(如[示例]列中注释)。结果视您用于搜索的搜索条件而异。对于使用 SIMILAR TO 的示例,结果还要另外根据是否区分大小写和重音而异。

有关 REGEXP 和 SIMILAR TO 如何处理匹配和计算范围的比较,请参见LIKE、REGEXP 和 SIMILAR TO 搜索条件。

请注意,如果在文字字符串中使用这些示例(例如,'.+@.+..+'),则应使用双反斜线

示例 匹配示例
信用卡号(仅限 REGEXP):

Visa:

4[0-9]{3}s[0-9]{4}s[0-9]{4}s[0-9]{4}

MasterCard:

5[0-9]{3}s[0-9]{4}s[0-9]{4}s[0-9]{4}

American Express:

37[0-9]{2}s[0-9]{4}s[0-9]{4}s[0-9]{4}

Discover:

6011s[0-9]{4}s[0-9]{4}s[0-9]{4}

匹配 (Visa): 4123 6453 2222 1746

非匹配 (Visa):

3124 5675 4400 4567, 4123-6453-2222-1746

同样,MasterCard 匹配一组 16 位的号码,以 5 开头,每四位号码组成的子集之间各有一个空格。American Express 和 Discover 是相同的,但是必须分别以 37 和 6011 开头。

日期(REGEXP 和 SIMILAR TO 均适用):

([0-2][0-9]|30|31)/(0[1-9]|1[0-2])/[0-9]{4}

匹配: 31/04/1999, 15/12/4567

非匹配: 31/4/1999, 31/4/99, 1999/04/19, 42/67/25456

Windows 绝对路径(仅限 REGEXP):

([A-Za-z]:|)[[:alnum:][:whitespace:]!"#$%&'()+,-.;=@[]^_`{}~.]*

匹配:serversharefile

非匹配:directorydirectory2, /directory2

电子邮件地址(仅限 REGEXP):

[[:word:]-.]+@[[:word:]-.]+.[[:alpha:]]{2,3}

匹配:abc.123@def456.com, _123@abc.ca