用正则表达式空格分隔符拆分字符串

时间:2015-04-12 21:48:21

标签: sql regex oracle split

我有一个带有此分隔符的字符串' - ' (连字符被空格包围)。 获取字符串的每个部分都没有问题:

select regexp_substr(val, '[^-]+', 1, 1),
       regexp_substr(val, '[^-]+', 1, 2)
from (select 'first - second' as val from dual) t

但是我想在每个术语和连字符之间排除空格。我试过这个:

regexp_substr(val, '[^\s-]+', 1, 1)
regexp_substr(val, '[^-\s]+', 1, 2)

但它似乎不起作用。第一个表达式返回fir

1)我想知道为什么? 这是Fiddle的链接:

http://www.sqlfiddle.com/#!4/d41d8/41570

2)我该如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

如果您想拆分字符串以便不需要否定字符类,则可以使用以下模式进行拆分:

'[\s-]+'

如果您只是想找到可以使用的词语:

\b[a-zA-Z]+\b

答案 1 :(得分:0)

如果你想从开头和结尾删除空格,那么我认为最简单的方法是使用trim()

select trim(regexp_substr(val, '[^-]+', 1, 1)),
       trim(regexp_substr(val, '[^-]+', 1, 2))
from (select 'first - second' as val from dual) t

答案 2 :(得分:0)

捕获组中的目标并让函数返回:

select regexp_substr(val, '(.*) *- *', 1, 1, '', 1),
   regexp_substr(val, ' *- *(.*)', 1, 1, '', 1)
from (select 'first - second' as val from dual) t

请参阅SQLFiddle

这使您可以更准确地表达您的分隔符。这种技术是使用预测表达式的下一个最好的方法,这是支持它的正则表达式引擎中最受欢迎的方法,以及Oracle不支持的方法。

为了解释发生了什么,目标是使用括号捕获并使用后引用返回 - 最后一个参数 - 命名组1(第一个组表达式)将被退回。

FYI组0是整个匹配。