正则表达式用于下列 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}-'
正则表达式包含一个或多个分支。分支用管道(|)隔开,指示每个分支都是备用模式。
例如,如果在函数 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”),原因是它们在参与模式匹配后勉强算法会将这些字符视为已使用。
字符转义 | 表示的字符 | 描述 |
---|---|---|
\n | #x0A | 换行 |
\r | #x0D | 回车 |
\t | #x09 | 制表符 |
\\ | \ | 反斜杠 |
\| | | | 管道 |
\. | . | 句点 |
\- | - | 连字符 |
\^ | ^ | 插入标记 |
\? | ? | 问号 |
\$ | $ | 美元符号 |
\* | * | 星号 |
\+ | + | 加号 |
\{ | { | 左花括号 |
\} | } | 右花括号 |
\( | ( | 左圆括号 |
\) | ) | 右圆括号 |
\[ | [ | 左方括号 |
\] | ] | 右方括号 |
多字符转义 | 等价正则表达式 | 描述 |
---|---|---|
\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 类别:标点、分隔符及其他。 |
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 | 其他 | 未指定 |