行分隔的不同长度单词的正则表达式

时间:2013-06-28 08:25:01

标签: sql regex oracle

我从另一篇文章中得到了以下查询,但似乎它不适用于单个字符。

SELECT regexp_substr('abc
def
ghi', '.+[[:alpha:]]', 1 ,level)
FROM dual
     CONNECT BY regexp_substr('abc
def
ghi', '.+[[:alpha:]]', 1 ,level) IS NOT NULL;

输出

abc
def
ghi

当我为单个字符尝试此操作时,它无法按预期工作。

 SELECT regexp_substr('a
b
c', '.+[[:alpha:]]', 1 ,level)
FROM dual
     CONNECT BY regexp_substr('a
b
c', '.+[[:alpha:]]', 1 ,level) IS NOT NULL;

2 个答案:

答案 0 :(得分:0)

这是因为你的正则表达。将其更改为查找 连续的字母字符:

 select regexp_substr('abc
 def
 ghi', '[[:alpha:]]+', 1 ,level)
   from dual
connect by regexp_substr('abc
def
ghi', '[[:alpha:]]+', 1 ,level) is not null

它也适用于单个字符:

select regexp_substr('a
b
c', '[[:alpha:]]+', 1 ,level)
from dual
     connect by regexp_substr('a
b
c', '[[:alpha:]]+', 1 ,level) is not null;

您评论过:

  

但我的实际要求是,单行可能有也可能没有单个单词,或单个字符,也包含数字,空格等,例如:'这是一个数字333

请始终将所有信息都放在问题中。

您似乎希望拆分换行符(回车符或回车符/换行符)

在这种情况下,您希望将某些内容分成 其中一个字符。我在这里使用了所有控制字符,因为我很懒,但它适用于您提供的数据。如果你有一些贝尔字符,这将不起作用,你必须更具体。

with the_data as ( 
select 'a
b
c' as dat
  from dual
       )
 select regexp_substr(dat, '[^[:cntrl:]]+', 1 ,level)
  from the_data
connect by regexp_substr(dat, '[^[:cntrl:]]+', 1 ,level) is not null;

答案 1 :(得分:0)

试试这个:

SELECT regexp_substr('a
b
c', '[[:alpha:]]', 1 ,level)
FROM dual
CONNECT BY regexp_substr('a
b
c', '[[:alpha:]]', 1 ,level) IS NOT NULL;