Regex 正则表达式-不匹配单词后的空值
我正在拆分管道上的字符串,当缺少字段时,正则表达式[^ |]*工作正常,但它在单词后匹配空字符: 垃圾| | | GA | 30604 产量匹配 垃圾,null,null,null,GA,null,30604,null 我还尝试了[^ |]+以产生匹配 垃圾,佐治亚州,30604 编辑:我想要的是垃圾,null,null,GA,30604。和| | | | |将产生匹配null,null,null,null,null,nullRegex 正则表达式-不匹配单词后的空值,regex,plsql,Regex,Plsql,我正在拆分管道上的字符串,当缺少字段时,正则表达式[^ |]*工作正常,但它在单词后匹配空字符: 垃圾| | | 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字符串是正确的。打印时应为原始正则表达式。?:^ |?