我有一个带有此分隔符的字符串' - ' (连字符被空格包围)。 获取字符串的每个部分都没有问题:
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)我该如何解决这个问题?
答案 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是整个匹配。