用正则表达式分隔符分割字符串
问题描述:
我有一个带有这个分隔符' - '的字符串(连字符被空格包围)。 我没有问题,得到的字符串的各个部分:用正则表达式分隔符分割字符串
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
答
如果你想从开头和结尾删除空格,那么我认为最简单的方法是使用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
这可以让你表达更精确的分隔符。这种技术是使用向前看表达式的下一个最好的事情,这将是支持它的正则表达式引擎中最受欢迎的方法,而Oracle不支持这种方法。
为了解释这是怎么回事,目标是捕获使用支架,它采用反向引用返回 - 最后一个参数 - 命名组1(第一组表达的)归还。
FYI组0是整个匹配。
谢谢卡斯拉,但我无法使用您的正则表达式检索正确的结果。你如何在我的情况下使用它们? – kaligne