\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 支持的断言:
语法
含义
例如,SELECT REGEXP_SUBSTR( 'in new york city', 'new(?=\\syork)'); 会返回子串 new,因为它后面紧跟着 ' york'(请注意 york 前面的空格)。
(?=pattern)
肯定的 lookahead 零宽度断言 查看字符串中的当前位置是否紧跟着出现了 pattern,而 pattern 不会成为匹配字符串的一部分。'A(?=B)' 匹配后面跟有 B 的 A,但不使 B 成为匹配的一部分。
(?!pattern)
否定的 lookahead 零宽度断言 查看字符串中的当前位置是否没有 紧跟着出现 pattern,而 pattern 不会成为匹配字符串的一部分。所以,'A(?!B)' 匹配后面未跟着 B 的 A。