gpt4 book ai didi

sql - SQL中两个字符定界符上的正则表达式子字符串

转载 作者:行者123 更新时间:2023-12-04 16:13:51 26 4
gpt4 key购买 nike

我正在尝试获取分隔字符串并返回分隔符之间的每个子字符串。这用于我正在编写的更大的函数中,因此分隔符通常是一个变量。

我们使用的一个非常常见的分隔符是 ', ',因此这是我的第一个测试用例。根据我如何格式化正则表达式中的定界符,我遇到了不同的问题。

以下是我尝试过的不同方法和结果:

select REGEXP_SUBSTR ('foo bar', '[^' || '(, )' || ']+', 1, LEVEL) item
from dual
connect by REGEXP_SUBSTR ('foo bar', '[^' || '(, )' || ']+', 1, LEVEL

select REGEXP_SUBSTR ('foo bar', '[^' || '(,\s)' || ']+', 1, LEVEL) item
from dual
connect by REGEXP_SUBSTR ('foo bar', '[^' || '(,\s)' || ']+', 1, LEVEL

select REGEXP_SUBSTR ('foo bar', '[^' || '(,[:blank:])' || ']+', 1, LEVEL) item
from dual
connect by REGEXP_SUBSTR ('foo bar', '[^' || '(,[:blank:])' || ']+', 1, LEVEL

第一次和第三次尝试在空格上分隔“foo”和“bar”,即使没有逗号。后一种尝试将“foo”和“bar”保持在同一行,但如果字符串中有一个 s(例如 horse),则结果为“hor”“e”。

我对正则表达式和 regexp_substr 的理解告诉我

'[^(,\s)]+'

应该在遇到逗号和空格时分隔字符串。但显然这不会发生。我还没有找到和我有类似问题的人。任何帮助将不胜感激

作为引用,我正在使用 SQL Developer 开发 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

最佳答案

您对匹配字符列表的工作方式感到困惑。 From the documentation :

[char...] Matching Character List

Matches any single character in the list within the brackets. In the list, all > operators except these are treated as literals:

Range operator: -
POSIX character class: [: :]
POSIX collation element: [. .]
POSIX character equivalence class: [= =]

因此在您的模式 '[^(,\s)]+' 中,每个字符都被视为文字; \ 不会将 s 视为空白字符,它只是一个 s,所以它在 horse< 中匹配。括号也是文字,因此它们不会在分隔符中包含这对字符,每个字符都与字符串中的实际括号匹配。在您的第一次和第三次尝试中,您仅在一个空格上获得匹配,因为匹配列表中的每个字符都是独立的,它们没有像您期望的那样由括号组合。

据我所知,您不能否定一对值(尽管正则表达式不是强项,所以我很可能错了)。一种选择是用您知道不会出现的字符替换分隔符的所有外观 - 根据您的实际数据,您可能必须选择不可打印的字符或晦涩的 Unicode 字符 - 然后在正则表达式中使用它。

例如,为简洁起见使用绑定(bind)变量,并使用散列作为我知道不存在的字符:

variable string varchar2(20);
variable delimiter varchar2(2);

exec :string := 'foo bar, the cad, left';
exec :delimiter := ', ';

select regexp_substr(replace(:string, :delimiter, '#'),
'[^#]+', 1, level) as item
from dual
connect by regexp_substr(replace(:string, :delimiter, '#'),
'[^#]+', 1, level) is not null;

ITEM
--------------------
foo bar
the cad
left

关于sql - SQL中两个字符定界符上的正则表达式子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28506150/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com