如何在 REGEXP_SUBSTR() 的字符集中包含撇号

How to include apostrophe in character set for REGEXP_SUBSTR()

正则表达式的 IBM i 实现使用撇号(而不是斜线)来分隔正则表达式字符串,即:

... where REGEXP_SUBSTR(MYFIELD,'myregex_expression')

如果我尝试在表达式中的 [group] 内使用撇号,它总是会出错 - 大概是认为我在给出结束引号。我试过:
- 转义它:\'
- 加倍:''(和三倍)

没有快乐。我在 IBM SQL 手册或 google 搜索中找不到任何相关内容。

我真的需要它,例如,允许像 O'Leary 这样的名字。

感谢 Wiktor Stribizew 在评论中的回答。

有几个 "gotchas" 对于可能遇到同样问题的人。首先是您必须提供(大概是 Unicode)十六进制值而不是您将使用的 EBCDIC 值,例如在 IBM i 上的普通交互 SQL 中。所以在这种情况下,它确实是 \x27 而不是 \x7D 用于撇号。大概这是因为 REGEXP_ ... 函数正在通过 Unicode 工作,即使对于 EBCDIC 数据也是如此。

第二件事是十六进制值似乎不能是集合中的最后一个。所以这有效:

^[A-Z0-9_\+\x27-]+ ... etc.

但这不是

^[A-Z0-9_\+-\x27]+ ... etc.

我不知道如何在代码示例中突出显示文本,所以我提请您注意连字符在第一个示例中排在最后,在第二个示例中排在倒数第二。

如果有人知道为什么它不是最后一个,我很想知道。 [编辑:原因见 Wiktor 的回答]

顺便说一句,在此上下文中,使用双引号作为带撇号的字符串定界符不起作用。

可以使用 \x27 符号定义单引号:

^[A-Z0-9_+\x27-]+
          ^^^^

请注意,当您在字符 class/bracket 表达式中使用连字符时,当在某些字符之间使用时,它会在这些符号之间形成一个 范围。当您使用 ^[A-Z0-9_\+-\x27]+ 时,您定义了 +' 之间的范围,这是一个无效范围,因为 + 在 Unicode ' 之后出现 [=24] =].