在 Oracle SQL 中使用正则表达式在字符串字段中查找 Unicode 字符
Posted
技术标签:
【中文标题】在 Oracle SQL 中使用正则表达式在字符串字段中查找 Unicode 字符【英文标题】:Finding Unicode Characters in String Field with Regex in Oracle SQL 【发布时间】:2021-05-06 01:40:06 【问题描述】:我有一个字符串字段 (cmets),其中包含一个用户 ID,例如“THOMASAN”。但是,字符串字段是动态的,可以在其中写入大量内容。但它总是有模式'UserID'。我正在尝试使用 Oracle SQL 中的 REGEXP_SUBSTR 函数来提取名称。
我已经尝试过 REGEXP_SUBSTR(cmets,'[A-Z]*') 但它会返回 null。如何在字符串字段中提取此用户 ID?
【问题讨论】:
能否展示一个示例 cmets 数据? 您并没有告诉函数您只需要用户 ID 部分。没有时间正确回答,但使用regexp_substr()
的subexpr
参数并在要保留的字符串部分周围添加一个组:dbfiddle.uk/…
试试unistr('\F7FD') || '[[:alpha:]]+'
。
您的问题有问题。您显示的 Unicode 字符似乎是 \F7FD
。但这不是一个有效的 Unicode 字符;值 F7FD 位于 Unicode 的私人使用区域中,这意味着 - 根据定义 - 它没有分配给任何字符。所以,请详细说明。在 Oracle 中使用 Unicode 并不难,但使用无效的 Unicode 值可能是不可能的。
【参考方案1】:
更新:
对于你提到的具体unicode
with cte as ( SELECT ' the left padding thomsan the right padding' comments FROM dual),
cte2 as (select ASCIISTR(upper(comments)) cmt from cte)
SELECT replace(regexp_substr( cmt, '\F7FD[A-Z]+', 1), 'F7FD','') userid from cte2;
【讨论】:
OP 专门询问 Unicode 字符的困难。 “THOMASAN”示例就是这样 - 而且,OP 特别提到它是可行的,而他更一般的情况可能包括 Unicode,而 that 不起作用。除非您可以解释您的答案与问题有何关系,特别是与 Unicode 有什么关系,否则我将不得不回过头来将此答案否决为“没有帮助”(除非您选择自己自愿删除)。 下次我会更仔细地阅读问题。我的理解是 UserID 将始终是模式,并且这个特殊字符 将作为 UserID 的前缀存在。除非列值中有更多 字符与 UserID 具有相同的模式,否则我的查询应该适用于该特定字符。 感谢您的回复。我能够为我的问题找到解决方案。我最终将此 REGEXP_SUBSTR(ASCIISTR(A.cmets),'(|F7FD)([A-Z]*)_(CLOSE|COMPLETED)',1,1,'i',2) 作为 AGENT_USERID以上是关于在 Oracle SQL 中使用正则表达式在字符串字段中查找 Unicode 字符的主要内容,如果未能解决你的问题,请参考以下文章
Oracle SQL 正则表达式 (regexp_substr)
正则表达式:字符串中重复相同的元音 - Oracle SQL