正则表达式
正则表达式是一个字符序列,这些字符充当匹配和操作字符串的模式。
正则表达式用于下列 XQuery 函数:fn:matches、fn:replace 和 fn:tokenize。 Db2® XQuery 正则表达式支持基于 W3C 建议 XML 模式部分 2: 数据类型第二版 中定义的 XML 模式正则表达式支持以及 W3C 建议 XQuery 1.0 和 XPath 2.0 函数和运算符定义的扩展。
语法
RegularExpression
- 1 The syntax for regular-expression represents the content of a string literal that cannot include whitespace characters other than as the specific meaning of the whitespace character as a pattern character. Do not consider spaces or portions between syntax elements as allowing any form of whitespace.
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 次。
- 最大
- 与原子匹配不超过 max 次。 max必须为大于或等于 min 的正整数。
{0, max}与原子匹配不超过 min 次。{0, 0}仅与空字符串匹配。
CharGroup
- ^
- 指示由 CharGroup 的余下部分定义的字符组的补充部分。
- dashChar
- 虚线字符(-)会隔开用于定义一定字符范围中的外部字符的两个字符。 格式为
s-e的字符范围是一组 UCS2 代码点,这些代码点大于或等于s并且小于或等于e:s不是反斜杠(\)- 如果
s是 CharGroup 中的第一个字符,那么它不是插入标记(^) e不是反斜杠(\)或左方括号([)- e 的代码点大于
s的代码点
- XMLCharInclude短划线
- 有效 XML 字符集中的单个字符,不包括反斜杠 (\) 和方括号 ([]) ,但包括短划线 (-)。 短划线仅在 CharGroup的开头或结尾作为字符有效。 CharGroup 开头的插入标记(^)指示组的补充部分。 插入标记出现在组中的任何其他位置时仅与插入标记相匹配。 XMLCharIncludeDash可包括根据正则表达式
[^\#5B#5D]匹配的任何字符。 - XMLChar
- 有效 XML 字符集中的单个字符,不包括反斜杠 (\) ,方括号 ([]) 和短划线 (-)。 短划线仅在 CharGroup的开头或结尾作为字符有效。 CharGroup 开头的插入标记(^)指示组的补充部分。 插入标记出现在组中的任何其他位置时仅与插入标记相匹配。 XMLChar可包括根据正则表达式
[^\#2D#5B#5D]匹配的任何字符。 - charEscape
- 反斜杠,后跟单个元字符、换行符、回车符或跳进字符。 必须在正则表达式中对 Table 1 中的字符进行转义以进行匹配。
表 1. 有效元字符转义 字符转义 表示的字符 描述 \n#x0A 换行 \r#x0D 返回 \t#x09 制表符 \\\ 反斜杠 \|| 管道 \.. 句点 \-- 连字符 \^^ 插入标记 \?? 问号 \$$ 美元符号 \** 星号 \++ 加号 \{{ 左花括号 \}} 右花括号 \(( 左圆括号 \)) 右圆括号 \[[ 左方括号 \]] 右方括号
CharClassEscape
- .
- 句点字符 ( . ) 匹配除换行和回车字符以外的所有字符。 句点字符等价于表达式
[^\n\r]/ - \nonZero数字
- 指定与根据子表达式匹配的字符串相匹配的向后引用,该子表达式在正则表达式中的nonZeroDigit 位置是用圆括号括起来的。 nonZeroDigit 必须介于 1 与 9 之间。 可以引用前 9 个子表达式。注: 为了将来的向上兼容性,如果后面的引用后跟数字字符,请将后面的引用括在括号中。 例如,对后跟数字 3 的第一个子表达式的向后引用应表示为
(/1)3而不是/13,即使两者目前会生成同一结果也是如此。 - \P{IsblockName}
- 指定 Unicode 代码点范围的补充部分。 范围由 blockName标识,如 XML SchemaPart 2: Datatypes Second Edition 中列示的那样。
- \p{IsblockName}
- 在特定范围的 Unicode 代码点中指定字符。 范围由 blockName标识,如 XML SchemaPart 2: Datatypes Second Edition 中列示的那样。
- charEscape
- 反斜杠,后跟单个元字符、换行符、回车符或跳进字符。 必须在正则表达式中对 Table 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中。
| 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 | 其他 | 未指定 |
