SQL Anywhere正则表达式语法与示例
正则表达式语法
通过SIMILARTO和REGEXP搜索条件以及REGEXP_SUBSTR函数支持正则表达式。对于SIMILARTO,正则表达式语法符合ANSI/ISOSQL标准。对于REGEXP和REGEXP_SUBSTR,正则表达式的语法和支持符合Perl5。
REGEXP和SIMILARTO使用正则表达式是与字符串相匹配,而REGEXP_SUBSTR使用正则表达式则是与子串相匹配。要实现REGEXP和SIMILARTO的子串匹配行为,可在要尝试匹配的模式的任何一侧指定通配符。例如,REGEXP'.*car.*'会与car、carwash和vicar匹配。或者,可重写查询以使用REGEXP_SUBSTR函数。请参见REGEXP_SUBSTR函数[String]。
通过SIMILARTO匹配的正则表达式不区分大小写,也不区分重音。REGEXP和REGEXP_SUBSTR不受数据库区分重音和大小写的影响。请参见LIKE、REGEXP和SIMILARTO:字符比较上的差异。
正则表达式:元字符
元字符是在正则表达式中具有特殊含义的符号或字符。
元字符的处理视以下情况而异:
-
正则表达式是与SIMILARTO或REGEXP搜索条件一起使用,还是与REGEXP_SUBSTR函数一起使用
-
元字符是否在正则表达式的字符类的内部
在继续之前,应了解字符类的定义。字符类是一组括在方括号内的字符,将根据这组字符对字符串中的字符进行匹配。例如,在SIMILARTO'ab[1-9]'语法中,[1-9]就是一个字符类,它与1到9范围中(包括1和9)的某一数字匹配。正则表达式中元字符的处理方式各不相同,这取决于元字符是否被放在字符类的内部。具体来说,当元字符放在字符类的内部时,多数元字符作为常规字符来处理。
对于SIMILARTO(仅限于SIMILARTO),元字符*、?、+、_、|、(、)、{必须在字符类内进行转义。
要在字符类中包括减号(-)、脱字符(^)或直角方括号(])字符,必须将字符转义。
下面给出了所支持的正则表达式元字符的列表。当SIMILARTO、REGEXP和REGEXP_SUBSTR使用元字符时,几乎所有元字符的处理方式都相同:
字符 | 其它信息 |
---|---|
[和] | 左右方括号用于指定字符类。字符类是进行匹配时所要依据的一组字符。
除连字符(-)和脱字符(^)外,在字符类中指定的元字符和量词(如*和{m},分别为元字符和量词)没有特殊意义,可当作实际字符进行运算。 SQLAnywhere还支持子字符类,例如POSIX字符类。请参见正则表达式:特殊子字符类。 |
* | 星号可用于与字符匹配0次或多次。例如,REGEXP'.*abc'匹配的字符串以abc结尾并以任何前缀开头。因此,aabc、xyzabc和abc匹配,但bc和abcc则不匹配。 |
? | 问号可用于与字符匹配0次或1次。例如,'colou?r'匹配color和colour。 |
+ | 加号可用于与字符匹配1次或多次。例如,'bre+'匹配bre和bree,但不匹配br。 |
- | 可以在字符类中使用一个连字符来表示一个范围。例如,REGEXP'[a-e]'匹配a、b、c、d和e。
有关REGEXP和SIMILARTO如何对范围求值的详细信息,请参见LIKE、REGEXP和SIMILARTO:字符比较上的差异。 |
% | 百分号可与SIMILARTO配合使用来匹配任意数目的字符。
不将百分号视为REGEXP和REGEXP_SUBSTR所使用的元字符。当指定时,它匹配百分号(%)。 |
_(下划线字符) | 可将下划线与SIMILARTO配合使用来匹配单个字符。
不将下划线视为REGEXP和REGEXP_SUBSTR所使用的元字符。当指定时,它匹配下划线(_)。 |
| | 管道符号用于指定匹配字符串时要使用的替代模式。在由竖线分隔的一行模式中,竖线被解释为OR,匹配过程从最左侧的模式开始,在找到第一个匹配项时停止。因此,您应按优先级的降序顺序列出模式。您可以指定任意数量的替代模式。 |
(和) | 当左括号和右括号用于正则表达式的各个组合部分时,它们为元字符。例如,(ab)*匹配零个或多个ab的重复项。与使用数学表达式一样,您使用组合来控制正则表达式各部分的计算顺序。 |
{和} | 当左大括号和右大括号用于指定量词时,它们为元字符。量词指定一个模式要构成某个匹配所必须重复的次数。例如:
|
\ | 反斜线被用作元字符的转义字符。它也可被用于转义非元字符。 |
^ | 对于REGEXP和REGEXP_SUBSTR,当脱字符在字符类的外部时,脱字符匹配字符串的开头字符。例如,'^[hc]at'匹配hat和cat,但只在字符串的开头。
当用在字符类内部时,以下行为适用:
|
$ | 当与REGEXP和REGEXP_SUBSTR一起使用时,匹配字符串的结尾字符。例如,SIMILARTO'cat$'匹配cat,但不匹配catfish。
当与SIMILARTO一起使用时,它匹配问号。 |
. | 当与REGEXP和REGEXP_SUBSTR一起使用时,匹配任何单个字符。例如,REGEXP'a.cd'匹配以a开头并以cd结尾的含有四个字符的任何字符串。
当与SIMILARTO一起使用时,它匹配句点(.)。 |
: | 在字符集中使用冒号来指定子字符类。例如,'[[:alnum:]]'。 |
正则表达式:特殊子字符类
子字符类是嵌入到较大字符类中的特殊字符类。除了自定义字符类(在其中定义要匹配的字符集,例如,[abxq4]将匹配字符集限制为a、b、x、q和4)以外,SQLAnywhere还支持子字符类,例如,大部分POSIX字符类。例如,[[:alpha:]]表示所有大写和小写字母的集合。
REGEXP搜索条件和REGEXP_SUBSTR函数支持下表中的所有语法约定,但SIMILARTO搜索表达式不支持。SIMILARTO支持的约定在SIMILARTO列中有一个Y。
在REGEXP中,当使用REGEXP_SUBSTR函数时,可以使用脱字符对子字符类取非。例如,[[:^alpha:]]匹配除字母字符以外的所有字符的集合。
子字符类 | 其它信息 | SIMILARTO | ||
---|---|---|---|---|
[:alpha:] | 匹配当前归类中的大写和小写字母字符。例如,'[0-9]{3}[[:alpha:]]{2}'匹配三个数字,后跟两个字母。 | Y | ||
[:alnum:] | 匹配当前归类中的数字、大写和小写字母字符。例如,'[[:alnum:]]+'匹配含有一个或多个字母和数字的字符串。 | Y | ||
[:digit:] | 匹配当前归类中的数字。例如,'[[:digit:]-]+'匹配含有一个或多个数字或横线的字符串。同样,'[^[:digit:]-]+'匹配含有一个或多个不是数字或横线的字符的字符串。 | Y | ||
[:lower:] | 匹配当前归类中的小写字母字符。例如,'[[:lower:]]'不匹配A,因为A为大写。 | Y | ||
[:space:] | 匹配单个空格('')。例如,以下语句搜索Contacts.City以查找任何名称为两个词的城市:
|
Y | ||
[:upper:] | 匹配当前归类中的大写字母字符。例如,'[[:upper:]ab]'与以下其中一项匹配:任何大写字母、a或b。 | Y | ||
[:whitespace:] | 匹配一个空白字符,例如,空格、制表符、换页符和回车符。 | Y | ||
[:ascii:] | 匹配任何七位的ASCII字符(0到127之间的顺序值)。 | |||
[:blank:] | 匹配一个空白区或水平制表符。
[[:blank:]]等效于[\t]。 |
|||
[:cntrl:] | 匹配顺序值小于32或字符值为127的ASCII字符(控制字符)。控制字符包括换行符、换页符、退格符,等等。 | |||
[:graph:] | 匹配打印字符。
[[:graph:]]等效于[[:alnum:][:punct:]]。 |
|||
[:print:] | 匹配打印字符和空格。
[[:print:]]等效于[[:graph:][:whitespace:]]。 |
|||
[:punct:] | 匹配其中一个字符:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~.
[:punct:]子字符类不能包括当前归类中可用的非ASCII标点字符。 |
|||
[:word:] | 匹配当前归类中的字母、数字或下划线字符。
[[:word:]]等效于[[:alnum:]_]。 |
|||
[:xdigit:] | 匹配字符类[0-9A-Fa-f]中的字符。 |
正则表达式:所支持的其它语法约定
REGEXP搜索条件和REGEXP_SUBSTR函数支持以下语法约定,同时它们假定反斜线为转义字符。而SIMILARTO搜索表达式不支持这些约定。
正则表达式语法 | 名称和含义 | ||
---|---|---|---|
\0xxx | 匹配值为\0xxx的字符,其中xxx是任何八进制数字序列,0是零。例如,\0134匹配反斜线。 | ||
\a | 匹配报警字符。 | ||
\A | 用在字符集外部以便匹配字符串的开头。
等效于在字符集外部使用的^。 |
||
\b | 匹配退格字符。 | ||
\B | 匹配反斜线字符(\)。 | ||
\cX | 匹配已命名的控制字符。例如,\cZ代表ctrl-Z。 | ||
\d | 匹配当前归类中的一个数字。例如,以下语句搜索Contacts.Phone以查找以00结尾的所有电话号码:
\d既可用在字符类的内部也可用在字符类的外部,等效于[[:digit:]]。 |
||
\D | 匹配数字以外的任何字符。它的作用与\d正好相反。
\D既可用在字符类的内部也可用在字符类的外部,等效于[^[:digit:]]。 在方括号内使用取非速记时请务必谨慎。[\D\S]与[^\d\s]并不相同。后者匹配数字或空格以外的任何字符。所以它匹配x,但不匹配8。而前者匹配不是数字或不是空格(满足两个条件之一)的任何字符。因为数字不是空格,空格也不是数字,所以[\D\S]可以匹配任何字符、数字、空格或其它字符。 |
||
\e | 匹配转义字符。 | ||
\E | 将由\Q启动的将元字符视为非元字符这一功能停止。
有关正则表达式元字符的列表,请参见正则表达式:元字符。 |
||
\f | 匹配换页符。 | ||
\n | 匹配换行符。 | ||
\Q | 将所有元字符视为非元字符,直到遇到\E。例如,\Q[$\E等效于\[\$。
有关正则表达式元字符的列表,请参见正则表达式:元字符。 |
||
\r | 匹配回车符。 | ||
\s | 匹配一个被视为白空格的空格或字符。例如,以下语句从Products.ProductName中返回名称中至少有一个空格的所有产品名:
\s既可用在字符类的内部也可用在字符类的外部,等效于[[:whitespace:]]。请参见正则表达式:特殊子字符类。 |
||
\S | 匹配非白空格字符。它的作用与\d正好相反,而等效于[^[:whitespace:]]。
\S既可用在字符类的内部也可用在字符类的外部。请参见正则表达式:特殊子字符类。 在方括号内使用取非速记时请务必谨慎。[\D\S]与[^\d\s]并不相同。后者匹配数字或空格以外的任何字符。所以它匹配x,但不匹配8。而前者匹配不是数字或不是空格(满足两个条件之一)的任何字符。因为数字不是空格,空格也不是数字,所以[\D\S]可以匹配任何字符、数字、空格或其它字符。 |
||
\t | 匹配水平制表符。 | ||
\v | 匹配垂直制表符。 | ||
\w | 匹配当前归类中的字母字符、数字或下划线。例如,以下语句从Contacts.Surname返回长度正好为七个字母数字字符的所有姓:
\w既可用在字符类的内部也可用在字符类的外部。请参见正则表达式:特殊子字符类。 等效于[[:alnum:]_].。 |
||
\W | 匹配当前归类中字母字符、数字或下划线以外的任何字符。它的作用与\w正好相反,而等效于[^[:alnum:]_]。
在字符类的内部和外部都可使用此正则表达式。请参见正则表达式:特殊子字符类。 |
||
\xhh | 匹配值为0xhh的字符,其中hh最多为两个十六进制数字。例如,\x2D等效于一个连字符。
等效于\x{hh}。 |
||
\x{hhh} | 匹配值为0xhhh的字符,其中hhh最多为三个十六进制数字。 | ||
\z和\Z | 匹配字符串结尾处的位置(而非字符)。
等效于$。 |
正则表达式:断言
断言测试条件是否为真,并影响字符串中开始匹配的位置。断言不返回字符;最终匹配中不包括断言模式。REGEXP搜索条件和REGEXP_SUBSTR函数支持这些断言模式。而SIMILARTO搜索表达式不支持这些约定。
在尝试拆分字符串时,lookahead和lookbehind断言对于REGEXP_SUBSTR将非常有用。例如,您可以通过执行以下语句返回Customers表的Address列中街道名称(不带街道编号)的列表:
|
另一个示例:假定您想要使用正则表达式来验证口令是否符合某些规则。您可以使用类似于下面内容的零宽度断言:
|
当满足以下条件时,口令有效:
password至少有一位数(零宽度肯定断言[[:digit:]])
password至少有两个字母字符(零宽度肯定断言[[:alpha:]].*[[:alpha:]])
password只含有字母数字字符或下划线字符([[:word:]])
password最少含有4个字符,最多含有12个字符({4,12})
下表包含SQLAnywhere支持的断言:
语法 | 含义 |
---|---|
(?=pattern) | 肯定的lookahead零宽度断言查看字符串中的当前位置是否紧跟着出现了pattern,而pattern不会成为匹配字符串的一部分。'A(?=B)'匹配后面跟有B的A,但不使B成为匹配的一部分。
例如,SELECTREGEXP_SUBSTR('innewyorkcity','new(?=\\syork)');会返回子串new,因为它后面紧跟着'york'(请注意york前面的空格)。 |
(?!pattern) | 否定的lookahead零宽度断言查看字符串中的当前位置是否没有紧跟着出现pattern,而pattern不会成为匹配字符串的一部分。所以,'A(?!B)'匹配后面未跟着B的A。
例如,SELECTREGEXP_SUBSTR('newjersey','new(?!\\syork)');会返回子串new。 |
(?<=pattern) | 肯定的lookbehind零宽度断言查看字符串中的当前位置是否前面紧挨着出现了pattern,而pattern不会成为匹配字符串的一部分。所以,'(?<=A)B'匹配前面紧挨着A的B,但不使A成为匹配的一部分。
例如,SELECTREGEXP_SUBSTR('newyork','(?<=new\\s)york');会返回子串york。 |
(?pattern) | 否定的lookbehind零宽度断言查看字符串中的当前位置的前面是否没有紧挨着出现pattern,而pattern不会成为匹配字符串的一部分。
例如,SELECTREGEXP_SUBSTR('aboutyork','(? |
(?>pattern) | 所属关系局部子表达式仅匹配与pattern匹配的剩余字符串的最大前缀。
例如,在'aa'REGEXP'(?>a*)a'中,(?>a*)匹配(并消耗)aa,而决不仅仅是前导a。因此,'aa'REGEXP'(?>a*)a'的计算结果为false。 |
(?:pattern) | 非捕获块该语法在功能上就等效于pattern,是为实现兼容性而提供。
例如,在'bb'REGEXP'(?:b*)b'中,(?:b*)匹配(并消耗)bb。但是,与所属关系局部子表达式不同,bb中的最后一个b会被放弃,以允许整个匹配成功(即,允许与在非捕获块的外部找到的b匹配)。 同样,'a(?:bc|b)c'匹配abcc和abc。在匹配abc时,bc中最后面的c会发生回溯,以便可以使用组外的c来使匹配成功。 |
(?#text) | 用于注释。text的内容会被忽略。 |
正则表达式示例
下表显示正则表达式的使用示例。所有示例都适用于REGEXP,部分示例也适用于SIMILARTO(如[示例]列中注释)。结果视您用于搜索的搜索条件而异。对于使用SIMILARTO的示例,结果还要另外根据是否区分大小写和重音而异。
有关REGEXP和SIMILARTO如何处理匹配和计算范围的比较,请参见LIKE、REGEXP和SIMILARTO搜索条件。
请注意,如果在文字字符串中使用这些示例(例如,'.+@.+\\..+'),则应使用双反斜线
示例 | 匹配示例 |
---|---|
信用卡号(仅限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} AmericanExpress: 37[0-9]{2}\s[0-9]{4}\s[0-9]{4}\s[0-9]{4} Discover: 6011\s[0-9]{4}\s[0-9]{4}\s[0-9]{4} |
匹配(Visa):4123645322221746
非匹配(Visa): 3124567544004567,4123-6453-2222-1746 同样,MasterCard匹配一组16位的号码,以5开头,每四位号码组成的子集之间各有一个空格。AmericanExpress和Discover是相同的,但是必须分别以37和6011开头。 |
日期(REGEXP和SIMILARTO均适用):
([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:]!"#$%&'()+,-.\\;=@\[\]^_`{}~.]* |
匹配:\\server\share\file
非匹配:\directory\directory2,/directory2 |
电子邮件地址(仅限REGEXP):
[[:word:]\-.]+@[[:word:]\-.]+\.[[:alpha:]]{2,3} |
匹配:abc.123@def456.com,_123@abc.ca
非匹配:abc@dummy,ab*cd@efg.hijkl |
电子邮件地址(仅限REGEXP):
.+@.+\..+ |
匹配:*@qrstuv@wxyz.12345.com,__1234^%@@abc.def.ghijkl
非匹配:abc.123.*&ca,^%abcdefg123 |
HTML十六进制颜色代码(REGEXP和SIMILARTO均适用):
[A-F0-9]{6} |
匹配:AB1234,CCCCCC,12AF3B
非匹配:123G45,12-44-CC |
HTML十六进制颜色代码(仅限REGEXP):
[A-F0-9]{2}\s[A-F0-9]{2}\s[A-F0-9]{2} |
匹配:AB1100,CC12D3
非匹配:SSABCD,AABBCCDD,1223AB |
IP地址(仅限REGEXP):
((2(5[0-5]|[0-4][0-9])|1([0-9][0-9])|([1-9][0-9])|[0-9])\.){3}(2(5[0-5]|[0-4][0-9])|1([0-9][0-9])|([1-9][0-9])|[0-9]) |
匹配:10.25.101.216
非匹配:0.0.0,256.89.457.02 |
Java注释(仅限REGEXP):
/\*.*\*/|//[^\n]* |
匹配位于/*和*/之间的Java注释,或者前缀为//的一行注释。
非匹配:a=1 |
货币(仅限REGEXP):
(\+|-)?\$[0-9]*\.[0-9]{2} |
匹配:$1.00,-$97.65
非匹配:$1,1.00$,$-75.17 |
正数、负数和小数值(仅限REGEXP):
(\+|-)?[0-9]+(\.[0-9]+)? |
匹配:+41,-412,2,7968412,41,+41.1,-3.141592653
非匹配:++41,41.1.19,-+97.14 |
口令(REGEXP和SIMILARTO均适用):
[[:alnum:]]{4,10} |
匹配:abcd,1234,A1b2C3d4,1a2B3
非匹配:abc,*ab12,abcdefghijkl |
口令(仅限REGEXP):
[a-zA-Z]\w{3,7} |
匹配:AB_cd,A1_b2c3,a123_
非匹配:*&^g,abc,1bcd |
电话号码(REGEXP和SIMILARTO均适用):
([2-9][0-9]{2}-[2-9][0-9]{2}-[0-9]{4})|([2-9][0-9]{2}\s[2-9][0-9]{2}\s[0-9]{4}) |
匹配:519-883-6898,5198886898
非匹配:8886898,5198886898,519883-6898 |
句子(仅限REGEXP):
[A-Z0-9].*(\.|\?|!) |
匹配:Hello,howareyou?
非匹配:iamfine |
句子(仅限REGEXP):
[[:upper:]0-9].*[.?!] |
匹配:Hello,howareyou?
非匹配:iamfine |
社保号码(REGEXP和SIMILARTO均适用):
[0-9]{3}-[0-9]{2}-[0-9]{4} |
匹配:123-45-6789
非匹配:123456789,123456789,1234-56-7891 |
URL(仅限REGEXP):
(http://)?www\.[a-zA-Z0-9]+\.[a-zA-Z]{2,3} |
匹配:http://www.sample.com、www.sample.com
非匹配:http://sample.com,http://www.sample.comm |
到此这篇关于SQLAnywhere正则表达式语法与示例的文章就介绍到这了,更多相关SQLAnywhere正则表达式内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!