我需要使用正则表达式解析CSV,并且一个特定的列必须是带引号的字符串或NULL(因为字符串不是null值)。
如果使用引号将其括起来,我可以获取该列,\,("[^"]*")
但是如果它为NULL,则尝试进行取回的尝试超出了我的范围。我以为那是类似的东西,\,(("[^"]*")|(NULL))
但这会导致奇怪的结果。
总结问题,它需要匹配:
“ Foo”
空值
但不是:
酒吧
编辑
如果我使用值“ This is a string,include it”,则匹配被拒绝(使用接受("[^"]*")
)。NULL被接受,但是它不返回字符串“ NULL”,这不是我所需要的行为)
这是完整的正则表达式:如代码中所示:
@fields = $line =~ /^
(\d{0,10}+)
\,(\d{0,10}+)
\,([0-9\.]{0,6}+)
\,([0-9\.]{0,6}+)
\,([^,]*)
\,([^,]*)
\,(\d*\.?\d*)
\,(\d*\.?\d*)
\,([^,]*)
\,([^,]*)
\,([^,]*)
\,([^,]*)
\,([^,]*)
\,(\w{3}+)
\,(\w{3}+)
\,([^,]*)
\,([^,]*)
\,(\w{0,10})
\,(\d+)
\,([^,]*)
\,(\d{1}+)
\,(("[^"]*")|(NULL))
\,([^,]*)
\,([^,]*)
$
/xo;
这是一个示例行(对不起,很抱歉):
1111,111111,0,0,这是一些文本,1111.11,0.00,0.00,2014-03-14 11:11:1111.111,文本,2014-03-11 11:11:11.111,文本,文本,LLL,AAA ,1900-01-01 00:00:00.000,1900-01-01 23:59:59.000,NULL,0,2014-03-11 11:00:11.111,1,NULL,1111111,NULL
输出:
1111
111111
0
0
这是一些文本
1111.11
0.00
0.00
2014-03-14 11:11:1111.111
文本
2014-03-11 11:11:11.111
文本
文本
LLL
AAA
1900-01-01 00:00:00.000
1900-01- 01 23:59:59.000
NULL
0
2014-03-11 11:00:11.111
1
NULL
空
1111111
空
看起来它为\,((“” [^“] *”)|(NULL))匹配返回3个值:NULL,一个空字符串和NULL(仅应返回单个NULL时)。
如果我将重要的NULL(最后一个值的第三位)括在引号中,则会得到以下输出:
1111
111111
0
0
这是一些文本
1111.11
0.00
0.00
2014-03-14 11:11:1111.111
文本
2014-03-11 11:11:11.111
文本
文本
LLL
AAA
1900-01-01 00:00:00.000
1900-01- 01 23:59:59.000
NULL
0
2014-03-11 11:00:11.111
1
“ NULL”
“ NULL”
1111111
空
这样也可以输出3个值,而不是应输出的单个“ NULL”
更改正则表达式的这一部分:
(("[^"]*")|(NULL))
到:
("[^"]*"|NULL)
您在那里有3个捕获组。第一个包含("[^"]*")|(NULL)
,第二个包含"[^"]*"
和第三个包含NULL
,如果您有NULL
,则将NULL
在第一个捕获组中有一个空的第二个捕获组,并NULL
在第三个捕获组中。
根据我的建议,您应该只有一个具有"[^"]*"
或的捕获组NULL
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句