如何在 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] =].
正则表达式的 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] =].