SQL Anywhere正则表达式语法与示例
正则表达式语法
通过 SIMILAR TO 和 REGEXP 搜索条件以及 REGEXP_SUBSTR 函数支持正则表达式。对于 SIMILAR TO,正则表达式语法符合 ANSI/ISO SQL 标准。对于 REGEXP 和 REGEXP_SUBSTR,正则表达式的语法和支持符合 Perl 5。
REGEXP 和 SIMILAR TO 使用正则表达式是与字符串 相匹配,而 REGEXP_SUBSTR 使用正则表达式则是与子串 相匹配。要实现 REGEXP 和 SIMILAR TO 的子串匹配行为,可在要尝试匹配的模式的任何一侧指定通配符。例如,REGEXP '.*car.*' 会与 car、carwash 和 vicar 匹配。或者,可重写查询以使用 REGEXP_SUBSTR 函数。请参见REGEXP_SUBSTR 函数 [String]。
通过 SIMILAR TO 匹配的正则表达式不区分大小写,也不区分重音。REGEXP 和 REGEXP_SUBSTR 不受数据库区分重音和大小写的影响。请参见LIKE、REGEXP 和 SIMILAR TO:字符比较上的差异。
正则表达式:元字符
元字符是在正则表达式中具有特殊含义的符号或字符。
元字符的处理视以下情况而异:
-
正则表达式是与 SIMILAR TO 或 REGEXP 搜索条件一起使用,还是与 REGEXP_SUBSTR 函数一起使用
-
元字符是否在正则表达式的字符类的内部
在继续之前,应了解字符类的定义。字符类是一组括在方括号内的字符,将根据这组字符对字符串中的字符进行匹配。例如,在 SIMILAR TO 'ab[1-9]' 语法中,[1-9] 就是一个字符类,它与 1 到 9 范围中(包括 1 和 9)的某一数字匹配。正则表达式中元字符的处理方式各不相同,这取决于元字符是否被放在字符类的内部。具体来说,当元字符放在字符类的内部时,多数元字符作为常规字符来处理。
对于 SIMILAR TO(仅限于 SIMILAR TO),元字符 *、"external nofollow" href="../dbreference_zh11/rf-sqllanguage-s-4915351.html#special-character-classes">正则表达式:特殊子字符类。
* 星号可用于与字符匹配 0 次或多次。例如,REGEXP '.*abc'
匹配的字符串以 abc 结尾并以任何前缀开头。因此,aabc、xyzabc 和 abc 匹配,但 bc 和 abcc 则不匹配。
"external nofollow" href="../dbreference_zh11/like-regexp-similarto.html#rf-sqllanguage-b-4686653">LIKE、REGEXP 和 SIMILAR TO:字符比较上的差异。
%
百分号可与 SIMILAR TO 配合使用来匹配任意数目的字符。
不将百分号视为 REGEXP 和 REGEXP_SUBSTR 所使用的元字符。当指定时,它匹配百分号 (%)。
_(下划线字符) 可将下划线与 SIMILAR TO 配合使用来匹配单个字符。不将下划线视为 REGEXP 和 REGEXP_SUBSTR 所使用的元字符。当指定时,它匹配下划线 (_)。
| 管道符号用于指定匹配字符串时要使用的替代模式。在由竖线分隔的一行模式中,竖线被解释为 OR,匹配过程从最左侧的模式开始,在找到第一个匹配项时停止。因此,您应按优先级的降序顺序列出模式。您可以指定任意数量的替代模式。 ( 和 ) 当左括号和右括号用于正则表达式的各个组合部分时,它们为元字符。例如,(ab)*
匹配零个或多个 ab 的重复项。与使用数学表达式一样,您使用组合来控制正则表达式各部分的计算顺序。
{ 和 }
当左大括号和右大括号用于指定量词时,它们为元字符。量词指定一个模式要构成某个匹配所必须重复的次数。例如:
-
{m} 匹配某个字符正好 m 次。例如,
'519-[0-9]{3}-[0-9]{4}'
匹配 519 地区号中的一个电话号码(假定数据按语法中定义的方式进行格式设置)。 -
{m,} 匹配某个字符至少 m 次。例如,
'[0-9]{5,}'
匹配任何含有五个或更多数字的字符串。 -
{m,n} 匹配某个字符至少 m 次,但不超过 n 次。例如,
SIMILAR TO '_{5,10}'
匹配任何含有 5 到 10(含 5 和 10)个字符的字符串。
'^[hc]at'
匹配 hat 和 cat,但只在字符串的开头。
当用在字符类内部时,以下行为适用:
-
REGEXP 和 REGEXP_SUBSTR 当脱字符为字符类中的第一个字符时,它与字符集中字符以外的任何字符匹配。例如,
REGEXP '[^abc]'
匹配 a、b 或 c 以外的任何字符。如果脱字符不是方括号内的第一个字符,那么它匹配脱字符。例如,
REGEXP_SUBSTR '[a-e^c]'
匹配 a、b、c、d、e 和 ^。 -
SIMILAR TO 对于 SIMILAR TO,脱字符被视作减号运算符。例如,
SIMILAR TO '[a-e^c]'
匹配 a、b、d 和 e。
SIMILAR TO 'cat$'
匹配 cat,但不匹配 catfish。
当与 SIMILAR TO 一起使用时,它匹配问号。
. 当与 REGEXP 和 REGEXP_SUBSTR 一起使用时,匹配任何单个字符。例如,REGEXP 'a.cd'
匹配以 a 开头并以 cd 结尾的含有四个字符的任何字符串。
当与 SIMILAR TO 一起使用时,它匹配句点 (.)。
: 在字符集中使用冒号来指定子字符类。例如,'[[:alnum:]]'
。
正则表达式:特殊子字符类
子字符类是嵌入到较大字符类中的特殊字符类。除了自定义字符类(在其中定义要匹配的字符集,例如,[abxq4]
将匹配字符集限制为 a、b、x、q 和 4)以外,SQL Anywhere 还支持子字符类,例如,大部分 POSIX 字符类。例如,[[:alpha:]]
表示所有大写和小写字母的集合。
REGEXP 搜索条件和 REGEXP_SUBSTR 函数支持下表中的所有语法约定,但 SIMILAR TO 搜索表达式不支持。SIMILAR TO 支持的约定在 SIMILAR TO 列中有一个 Y。
在 REGEXP 中,当使用 REGEXP_SUBSTR 函数时,可以使用脱字符对子字符类取非。例如,[[:^alpha:]]
匹配除字母字符以外的所有字符的集合。
'[0-9]{3}[[:alpha:]]{2}'
匹配三个数字,后跟两个字母。
Y
[:alnum:]
匹配当前归类中的数字、大写和小写字母字符。例如,'[[:alnum:]]+'
匹配含有一个或多个字母和数字的字符串。
Y
[:digit:]
匹配当前归类中的数字。例如,'[[:digit:]-]+'
匹配含有一个或多个数字或横线的字符串。同样,'[^[:digit:]-]+'
匹配含有一个或多个不是数字或横线的字符的字符串。
Y
[:lower:]
匹配当前归类中的小写字母字符。例如,'[[:lower:]]'
不匹配 A,因为 A 为大写。
Y
[:space:]
匹配单个空格 (' ')。例如,以下语句搜索 Contacts.City 以查找任何名称为两个词的城市:
SELECT City FROM Contacts WHERE City REGEXP '.*[[:space:]].*';
'[[:upper:]ab]'
与以下其中一项匹配:任何大写字母、a 或 b。
Y
[:whitespace:]
匹配一个空白字符,例如,空格、制表符、换页符和回车符。
Y
[:ascii:]
匹配任何七位的 ASCII 字符(0 到 127 之间的顺序值)。
[:blank:]
匹配一个空白区或水平制表符。
[[:blank:]]
等效于 [ \t]
。
[[:graph:]]
等效于 [[:alnum:][:punct:]]
。
[[:print:]]
等效于 [[:graph:][:whitespace:]]
。
\d 既可用在字符类的内部也可用在字符类的外部,等效于 [[:digit:]]
。
\D 既可用在字符类的内部也可用在字符类的外部,等效于 [^[:digit:]]
。
在方括号内使用取非速记时请务必谨慎。[\D\S]
与 [^\d\s]
并不相同。后者匹配数字或空格以外的任何字符。所以它匹配 x,但不匹配 8。而前者匹配不是数字或不是空格(满足两个条件之一)的任何字符。因为数字不是空格,空格也不是数字,所以 [\D\S]
可以匹配任何字符、数字、空格或其它字符。
有关正则表达式元字符的列表,请参见正则表达式:元字符。
\f 匹配换页符。 \n 匹配换行符。 \Q 将所有元字符视为非元字符,直到遇到 \E。例如,\Q[$\E
等效于 \[\$
。
有关正则表达式元字符的列表,请参见正则表达式:元字符。
\r 匹配回车符。 \s 匹配一个被视为白空格的空格或字符。例如,以下语句从 Products.ProductName 中返回名称中至少有一个空格的所有产品名:SELECT Name FROM Products WHERE Name REGEXP '.*\\s.*'