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

Regex 正则表达式-不匹配单词后的空值,regex,plsql,Regex,Plsql,我正在拆分管道上的字符串,当缺少字段时,正则表达式[^ |]*工作正常,但它在单词后匹配空字符: 垃圾| | | GA | 30604 产量匹配 垃圾,null,null,null,GA,null,30604,null 我还尝试了[^ |]+以产生匹配 垃圾,佐治亚州,30604 编辑:我想要的是垃圾,null,null,GA,30604。和| | | | |将产生匹配null,null,null,null,null,null 我正在按索引引用匹配项,因此如何修复正则表达式,使其按字段匹配,如果

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

垃圾| | | GA | 30604 产量匹配

垃圾,null,null,null,GA,null,30604,null

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

垃圾,佐治亚州,30604

编辑:我想要的是垃圾,null,null,GA,30604。和| | | | |将产生匹配null,null,null,null,null,null


我正在按索引引用匹配项,因此如何修复正则表达式,使其按字段匹配,如果字段中没有其他数据,则包括空值?

这就是拆分的工作方式。您应该使用拆分类型函数。 总有一种偏见

您的情况很简单,因为它在单个字符上拆分,在正常情况下不需要正则表达式。 在这种情况下,使用正则表达式,如果没有前向/后向,就无法实现偏差

 # (?:^|(?<=\|))([^|]*)(?=\||$)

 (?:
      ^                     # BOS
   |                      # or
      (?<= \| )             # Pipe behind
 )
 ( [^|]* )             # (1), Optional non-pipe chars
 (?=
      \|                    # Pipe ahead
   |                      # or
      $                     #  EOS
 )

虽然不完全是您想要的,但也许您可以将其转换为行并以这种方式使用它:

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子句指定行字段,其中级别等于所需的行字段:

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;

这在rubular.com上运行得很好,但是PL/SQL只将null与v_fullname:=REGEXP_SUBSTRinput_line,v_regex,1,2;匹配;。你知道为什么会这样吗?@benjsigmon-对不起,我不知道pl/sql。但是,看看正则表达式,你不需要捕获组。对于测试,您可以将逃逸的管道放入一个独立类中。另外,确保v_regex字符串是正确的。打印时应为原始正则表达式。?:^ |?