DB2 V10.1 for Linux, UNIX, and Windows

正则表达式

正则表达式是一个字符序列,这些字符充当匹配和操作字符串的模式。

正则表达式用于下列 XQuery 函数:fn:matches、fn:replace 和 fn:tokenize。DB2® XQuery 正则表达式支持基于 W3C Recommendation XML Schema Part 2: Datatypes Second Edition 中定义的 XML 模式正则表达式支持以及 W3C Recommendation XQuery 1.0 and XPath 2.0 Functions and Operators 定义的扩展。

语法

阅读语法图跳过直观语法图
RegularExpression

                     .--------------------------.   
    (1)              V                          |   
>>-------| Branch |----+----------------------+-+--------------><
                       '-pipeChar--| Branch |-'     

Branch

   .----------------------------------.   
   V                                  |   
|----+------------------------------+-+-------------------------|
     '-| Atom |-+-----------------+-'     
                '--| Quantifier |-'       

Atom

|--+-normalCharacter-------------+------------------------------|
   +-| CharClassExpression |-----+   
   +-| CharClassEscape |---------+   
   +-^---------------------------+   
   +-$---------------------------+   
   '-(--| RegularExpression |--)-'   

Quantifier

|--+-*-------------------------+--+---+-------------------------|
   +-+-------------------------+  '-?-'   
   +-?-------------------------+          
   '-{--+-min-------------+--}-'          
        '-min--,--+-----+-'               
                  '-max-'                 

CharClassExpression

|--[--| CharGroup |--]------------------------------------------|

CharGroup

          .----------------------------------------------.   
          V                                              |   
|--+---+----+-XMLCharIncludeDash-----------------------+-+------|
   '-^-'    +-+-XMLChar----+--dashChar--+-XMLChar----+-+     
            | '-charEscape-'            '-charEscape-' |     
            '-| CharClassEscape |----------------------'     

CharClassEscape

|--+-.----------------+-----------------------------------------|
   +-charEscape-------+   
   +-multiCharEscape--+   
   +-\nonZeroDigit----+   
   +-\p{IsblockName}--+   
   +-\P{IsblockName}--+   
   +-\p{charProperty}-+   
   '-\P{charProperty}-'   

注:
  1. 正则表达式的语法表示字符串文字内容,它不能包含具有作为模式字符的空格字符的特殊含义以外的空格字符。不要将语法元素之间的空格或部分视为允许使用任何形式的空格。

RegularExpression

正则表达式包含一个或多个分支。分支用管道(|)隔开,指示每个分支都是备用模式。

pipeChar
管道字符(|)会隔开正则表达式中的备用分支。
Branch
分支由零个或零个以上原子组成,每个原子允许一个可选量词。

Atom

原子是普通字符、字符类表达式、字符类转义或带括号正则表达式。
normalCharacter
并非表 1 中的任何匹配字符的任何有效 XML 字符。
^
在分支开头使用时,插入标记(^)指示该模式必须从字符串开头匹配。
$
在分支结尾使用时,美元符号($)指示该模式必须从字符串的结尾匹配。

Quantifier

量词指定原子在正则表达式的重复词数。缺省情况下,量词会使用称为贪婪算法的方式尽量与目标字符串进行匹配。例如,正则表达式 'A.*A' 与整个字符串 'ABACADA' 匹配,原因是必需的外部 'A' 字符之间的子串符合对任意字符的要求任意次数。可通过在量词后指定问号(?)字符来更改缺省贪婪算法。问号指定该模式匹配使用勉强算法,这会与目标字符串中满足正则表达式的下一个最短子串进行匹配(按从左至右的顺序)。例如,正则表达式 'A.*?A' 会与子串 'ABA' 和 'ADA' 匹配,而不是与整个字符串 'ABACADA' 匹配。通过使用勉强算法与正则表达式匹配的子串字符不会进行更进一步的匹配。这就是 'ACA' 在上一示例中未被视为匹配项的原因。勉强算法与 fn:replace 函数一起使用时很有帮助,原因是它会按从左至右的顺序处理匹配和进行替换。

例如,如果在函数 fn:replace("nonsensical","n(.*)s","mus") 中使用贪婪算法将以“n”开头“s”结尾的字符串替换为字符串“mus”,那么返回的值为“musical”。原始字符串包括子串“nons”和“ns”,并且与按从左至右进行的模式扫描(以查找下一匹配项)相匹配,但贪婪算法不会处理这些匹配,原因是它发现了更长的封闭匹配。

如果对函数 fn:replace("nonsensical","n(.*?)s","mus") 中的同一字符串使用勉强算法,那么结果会有所不同。返回的值为“musemusical”。在此情况下字符串中会进行两次替换。第一个匹配将“nons”替换为“mus”,第二个匹配将“ns”替换为“mus”。

又例如,如果在函数 fn:replace("AbrAcAdAbrA","A(.*)A","X$1X") 中使用贪婪算法将任何数目的字符两旁的字符 A 替换为相同字符两旁的字符 X,那么返回的值为“XbrAcAdAbrX”。原始字符串包括子串“AbrA”和“AdA”,并且与从左至右扫描以查找下一匹配时的模式相匹配,但贪婪算法不会处理这些匹配,原因是它发现了更长的封闭匹配。

如果对函数 fn:replace("AbrAcAdAbrA","A(.*?)A","X$1X") 中的同一字符串使用勉强算法,那么结果会有所不同。返回的值为“XbrXcXdXbrA”。在此情况下,字符串会进行两次替换,第一次替换“AbrA”,第二次替换“AdA”。字符串最后的“A”不会被替换,原因是勉强算法将前面所有的“A”字符用于字符串中的其他匹配。不会考虑原始字符串中以字符“A”开头和结尾的其他子串(如“AcA”、“AcAdA”、“AdAbrA”和“AbrA”),原因是它们在参与模式匹配后勉强算法会将这些字符视为已使用。

*
与原子匹配零次或多次。相当于量词 {0, }
+
与原子匹配一次或多次。相当于量词 {1, }
?
与原子匹配零次或一次。相当于量词 {0, 1}。如果跟在另一量词后,那么指示使用勉强算法而不是贪婪算法。
min
与原子匹配至少 min 次。min 必须为正整数。
  • {min} 与原子正好匹配 min 次。
  • {min, } 与原子匹配至少 min 次。
max
与原子匹配不超过 max 次。max 必须为大于或等于 min 的正整数。
  • {0, max} 与原子匹配不超过 min 次。
  • {0, 0} 仅与空字符串匹配。

CharGroup

^
指示由 CharGroup 的余下部分定义的字符组的补充部分。
dashChar
虚线字符(-)会隔开用于定义一定字符范围中的外部字符的两个字符。格式为 s-e 的字符范围是一组 UCS2 代码点,这些代码点大于或等于 s 并且小于或等于 e
  • s 不是反斜杠(\)
  • 如果 s 是 CharGroup 中的第一个字符,那么它不是插入标记(^)
  • e 不是反斜杠(\)或左方括号([)
  • e 的代码点大于 s 的代码点
XMLCharIncludeDash
有效 XML 字符的单字符形式,排除反斜杠(\)和方括号([]),但包括虚线字符(-)。虚线字符只有出现在 CharGroup 的开头或结尾才是有效字符。CharGroup 开头的插入标记(^)指示组的补充部分。插入标记出现在组中的任何其他位置时仅与插入标记相匹配。XMLCharIncludeDash 可包括根据正则表达式 [^\#5B#5D] 匹配的任何字符。
XMLChar
有效 XML 字符的单字符形式,排除反斜杠(\)、方括号([])和虚线字符(-)。虚线字符只有出现在 CharGroup 的开头或结尾才是有效字符。CharGroup 开头的插入标记(^)指示组的补充部分。插入标记出现在组中的任何其他位置时仅与插入标记相匹配。XMLChar 可包括根据正则表达式 [^\#2D#5B#5D] 匹配的任何字符。
charEscape
反斜杠,后跟单个元字符、换行符、回车符或跳进字符。必须在正则表达式中对表 1 中的字符转义以进行匹配。
表 1. 有效元字符转义
字符转义 表示的字符 描述
\n #x0A 换行
\r #x0D 回车
\t #x09 制表符
\\ \ 反斜杠
\| | 管道
\. . 句点
\- - 连字符
\^ ^ 插入标记
\? ? 问号
\$ $ 美元符号
\* * 星号
\+ + 加号
\{ { 左花括号
\} } 右花括号
\( ( 左圆括号
\) ) 右圆括号
\[ [ 左方括号
\] ] 右方括号

CharClassEscape

.
句点字符(.)与换行符和回车符以外的所有字符相匹配。句点字符等价于表达式 [^\n\r]/
\nonZeroDigit
指定与根据子表达式匹配的字符串相匹配的向后引用,该子表达式在正则表达式中的 nonZeroDigit 位置是用圆括号括起来的。nonZeroDigit 必须在 1 到 9 之间。可引用前 9 个子表达式。
注: 为了将来实现向上兼容性,如果向后引用后跟数字字符,那么应将向后引用括在圆括号中。例如,对后跟数字 3 的第一个子表达式的向后引用应表示为 (/1)3 而不是 /13,即使两者目前会生成同一结果也是如此。
\P{IsblockName}
指定 Unicode 代码点范围的补充部分。范围由 blockName 标识,如 XML Schema Part 2: Datatypes Second Edition 中列示的那样。
\p{IsblockName}
在特定范围的 Unicode 代码点中指定字符。范围由 blockName 标识,如 XML Schema Part 2: Datatypes Second Edition 中列示的那样。
charEscape
反斜杠,后跟单个元字符、换行符、回车符或跳进字符。必须在正则表达式中对表 1 中的字符转义以进行匹配。
multiCharEscape
一个反斜杠,后跟一个字符,用于在正则表达式中标识表 2 中的常用字符集以进行匹配。
表 2. 多字符转义
多字符转义 等价正则表达式 描述
\s [#x20\t\n\r] 空格、制表符、换行或回车符。
\S [^\s] 空格、制表符、换行或回车符以外的任何字符。
\i 允许作为 XML 名称的第一个字符的字符集。
\I [^\i] 不在允许作为 XML 名称的第一个字符的字符集中。
\c XML 名称中允许使用的字符集。
\C [^\c] 在 XML 名称中不允许使用的字符集中。
\d \p{Nd} 十进制数。
\D [^\d] 非十进制数。
\w [#x0000-#x10FFFF]-[\p{P}\p{Z}\p{C}] 单词字符,包括下列 charProperty 类别:字母、标记、符号和数字。
\W [^\w] 非单词字符,包括下列 charProperty 类别:标点、分隔符及其他。
\p{charProperty}
指定某个类别中的某个字符。类别列示在表 3 中。
\P{charProperty}
指定字符类别的补充部分。类别列示在表 3 中。
表 3. charProperty 的受支持值
charProperty 类别 描述
L 字母 所有字母
Lu 字母 大写
Ll 字母 小写
Lt 字母 标题
Lm 字母 修饰符
Lo 字母 其他
M 标记 所有标记
Mn 标记 非间隔
Mc 标记 间隔组合
Me 标记 封闭
N 数字 所有数字
Nd 数字 十进制数
Nl 数字 字母
数字 其他
P 标点 所有标点
Pc 标点 连接符
Pd 标点 连字符
Ps 标点
Pe 标点
Pi 标点 初始引号(根据用法,行为方式类似 Ps 或 Pe)
Pf 标点 最终引号(根据用法,行为方式类似 Ps 或 Pe)
Po 标点 其他
Z 分隔符 所有分隔符
Zs 分隔符 空格
Zl 分隔符
Zp 分隔符
S 符号 所有符号
Sm 符号 数学
Sc 符号 货币
Sk 符号 修饰符
So 符号 其他
C 其他 所有其他
Cc 其他 控制
Cf 其他 格式
Co 其他 专用
Cn 其他 未指定
注: 使用二进制比较来匹配正则表达式。不使用缺省整理。