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

\s 既可用在字符类的内部也可用在字符类的外部,等效于 [[:whitespace:]]。请参见。

 
\S   匹配非白空格字符。它的作用与 \d 正好相反,而等效于 [^[:whitespace:]]。

\S 既可用在字符类的内部也可用在字符类的外部。请参见。

在方括号内使用取非速记时请务必谨慎。[\D\S] 与 [^\d\s] 并不相同。后者匹配数字或空格以外的任何字符。所以它匹配 x,但不匹配 8。而前者匹配不是数字或不是空格(满足两个条件之一)的任何字符。因为数字不是空格,空格也不是数字,所以 [\D\S] 可以匹配任何字符、数字、空格或其它字符。

 
\t   匹配水平制表符。  
\v   匹配垂直制表符。  
\w   匹配当前归类中的字母字符、数字或下划线。例如,以下语句从 Contacts.Surname 返回长度正好为七个字母数字字符的所有姓: SELECT Surname FROM Contacts WHERE Surname REGEXP '\\w{7}';    

\w 既可用在字符类的内部也可用在字符类的外部。请参见。

等效于 [[:alnum:]_].。

 
\W   匹配当前归类中字母字符、数字或下划线以外的任何字符。它的作用与 \w 正好相反,而等效于 [^[:alnum:]_]。

在字符类的内部和外部都可使用此正则表达式。请参见。

 
\xhh   匹配值为 0xhh 的字符,其中 hh 最多为两个十六进制数字。例如,\x2D 等效于一个连字符。

等效于 \x{hh}。

 
\x{hhh}   匹配值为 0xhhh 的字符,其中 hhh 最多为三个十六进制数字。  
\z\Z   匹配字符串结尾处的位置(而非字符)。

等效于 $。

 
正则表达式:断言

断言测试条件是否为真,并影响字符串中开始匹配的位置。断言不返回字符;最终匹配中不包括断言模式。REGEXP 搜索条件和 REGEXP_SUBSTR 函数支持这些断言模式。而 SIMILAR TO 搜索表达式不支持这些约定。

在尝试拆分字符串时,lookahead 和 lookbehind 断言对于 REGEXP_SUBSTR 将非常有用。例如,您可以通过执行以下语句返回 Customers 表的 Address 列中街道名称(不带街道编号)的列表:

SELECT REGEXP_SUBSTR( Street, '(?<=^\\S+\\s+).*$' ) FROM Customers;    

另一个示例:假定您想要使用正则表达式来验证口令是否符合某些规则。您可以使用类似于下面内容的零宽度断言:

IF password REGEXP '(?=.*[[:digit:]])(?=.*[[:alpha:]].*[[:alpha:]])[[:word:]]{4,12}' MESSAGE 'Password conforms' TO CLIENT; ELSE MESSAGE 'Password does not conform' TO CLIENT; END IF    

当满足以下条件时,口令有效:

password 至少有一位数(零宽度肯定断言 [[:digit:]])

password 至少有两个字母字符(零宽度肯定断言 [[:alpha:]].*[[:alpha:]])

password 只含有字母数字字符或下划线字符 ([[:word:]])

password 最少含有 4 个字符,最多含有 12 个字符 ({4,12})

下表包含 SQL Anywhere 支持的断言:

语法 含义
(?=pattern)   肯定的 lookahead 零宽度断言 查看字符串中的当前位置是否紧跟着出现了 pattern,而 pattern 不会成为匹配字符串的一部分。'A(?=B)' 匹配后面跟有 B 的 A,但不使 B 成为匹配的一部分。

例如,SELECT REGEXP_SUBSTR( 'in new york city', 'new(?=\\syork)'); 会返回子串 new,因为它后面紧跟着 ' york'(请注意 york 前面的空格)。

 
(?!pattern)   否定的 lookahead 零宽度断言 查看字符串中的当前位置是否没有 紧跟着出现 pattern,而 pattern 不会成为匹配字符串的一部分。所以,'A(?!B)' 匹配后面未跟着 B 的 A。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wyfgpd.html