正则表达式 - 单词后不匹配空值

时间:2014-06-25 21:07:21

标签: regex plsql

我在管道(|)上拆分字符串,并且当缺少字段时正则表达式[^|]*正常工作,但它在单词之后匹配空字符:

GARBAGE|||GA|30604 产量匹配

GARBAGE, null, null, null, GA, null, 30604, null

我也尝试了[^|]+产生匹配

GARBAGE, GA, 30604

编辑:我想要的是GARBAGE, null, null, GA, 30604||||会产生匹配null, null, null, null, null

我正在通过索引引用匹配,那么如何修复正则表达式以使其逐字段匹配,如果字段中没有其他数据,则包括空值?

2 个答案:

答案 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;

enter image description here

通过添加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;

enter image description here