我在管道(|)上拆分字符串,并且当缺少字段时正则表达式[^|]*
正常工作,但它在单词之后匹配空字符:
GARBAGE|||GA|30604
产量匹配
GARBAGE, null, null, null, GA, null, 30604, null
我也尝试了[^|]+
产生匹配
GARBAGE, GA, 30604
编辑:我想要的是GARBAGE, null, null, GA, 30604
。 ||||
会产生匹配null, null, null, null, null
。
我正在通过索引引用匹配,那么如何修复正则表达式以使其逐字段匹配,如果字段中没有其他数据,则包括空值?
答案 0 :(得分:1)
这就是拆分的工作原理。您应该使用拆分类型功能 始终存在偏见拆分用途。
你的情况很简单,因为它会分裂一个字符,在正常情况下不需要正则表达式 在这种情况下,使用正则表达式,没有前瞻/后瞻就无法实现偏见。
# (?:^|(?<=\|))([^|]*)(?=\||$)
(?:
^ # BOS
| # or
(?<= \| ) # Pipe behind
)
( [^|]* ) # (1), Optional non-pipe chars
(?=
\| # Pipe ahead
| # or
$ # EOS
)
答案 1 :(得分:1)
虽然不完全是你想要的,但也许你可以将它变成行并以这种方式使用它:
select nvl(regexp_substr( str, '([^|]*)\|{0,1}', 1, level, 'i', 1 ), 'null') part
from ( select 'GARBAGE|||GA|30604' str from dual )
connect by level <= regexp_count( str, '\|' ) + 1;
通过添加where子句来指定哪一行(字段),其中level等于您想要的行(字段):
select nvl(regexp_substr( str, '([^|]*)\|{0,1}', 1, level, 'i', 1 ), 'null') part
from ( select 'GARBAGE|||GA|30604' str from dual )
where level = 4
connect by level <= regexp_count( str, '\|' ) + 1;