正则表达式是一个字符序列,这些字符充当匹配和操作字符串的模式。正则表达式用于下列 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 | 未指定 |