用正则表达式分隔符分割字符串

问题描述:

我有一个带有这个分隔符' - '的字符串(连字符被空格包围)。 我没有问题,得到的字符串的各个部分:用正则表达式分隔符分割字符串

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)我想知道为什么? 这里是链接到小提琴:

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

2)我怎样才能解决这个问题?

如果你想使你不需要否定的字符类来分割你的字符串,你可以用以下方式划分:

'[\s-]+' 

如果你只是想找到的话,你可以使用:

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

谢谢卡斯拉,但我无法使用您的正则表达式检索正确的结果。你如何在我的情况下使用它们? – kaligne

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

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

谢谢你,修饰funciton做的伎俩,所以我使用它!然而,如果没有修整,解决这个问题的可能正则表达式是什么? – kaligne

捕捉你的目标在一组,并有函数返回的是:

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是整个匹配。