Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Perl正则表达式查找以前的CSV字段_Regex_Perl_Csv - Fatal编程技术网

Regex Perl正则表达式查找以前的CSV字段

Regex Perl正则表达式查找以前的CSV字段,regex,perl,csv,Regex,Perl,Csv,我在CSV文件中遇到的一个常见场景是找到一个特定字段,然后在该字段之前或之后立即捕获该字段。例如,在下面的CSV行中,我的正则表达式正在查找state字段“NSW”,但我还需要捕获周围的字段: So Cross Univ, Sch Environm Sci & Engn, Lismore, NSW 2480 这是我迄今为止的尝试: (?P<city>([^,]*?))(?P<state>\b(WA|QLD|NSW|VIC|SA|NT|TAS)\b) (?P([

我在CSV文件中遇到的一个常见场景是找到一个特定字段,然后在该字段之前或之后立即捕获该字段。例如,在下面的CSV行中,我的正则表达式正在查找state字段“NSW”,但我还需要捕获周围的字段:

So Cross Univ, Sch Environm Sci & Engn, Lismore, NSW 2480
这是我迄今为止的尝试:

(?P<city>([^,]*?))(?P<state>\b(WA|QLD|NSW|VIC|SA|NT|TAS)\b)
(?P([^,]*?)(?P\b(西昆士兰州新南威尔士州维多利亚州新南威尔士州助教)
它正在占领州,但不是城市

在这里,场景是一个地址,但情况可能并不总是如此。因此,我试图提出一个通用正则表达式,它将搜索CSV字段并捕获两侧的字段

其他人也遇到过这个问题吗?

它正在为
城市捕获一个字符串,并且完全符合您的指定。当我尝试你的正则表达式时,我得到了城市名为
'
,如果你打印出没有分隔符的值,你可能会错过

您的正则表达式不允许使用逗号:非逗号字符串不是逗号,
状态的任何定义值也不是逗号。因此,您的正则表达式捕获它能捕获的唯一字符串,这些字符串之一之前的非逗号,一个空格。你没有说它不能是空格,你只是说它不能包含逗号

/(?P<city>([^,]*?)),\s*(?P<state>\b(WA|QLD|NSW|VIC|SA|NT|TAS)\b)/
/(?P([^,]*?),\s*(?P\b(西昆士兰州新南威尔士州维多利亚州新南威尔士州新南威尔士州助教))/
工作


是的,即使是老专业人士每天都能看到这样一个问题:没有捕捉到我们认为我们在指定的内容,而是我们实际指定的内容。知道如何调试正则表达式以及如何准确地打印出所捕获的内容是成功的一半。当然,在正则表达式丛林中的经验也可以帮助您发现一些类似于在逗号的两侧查找文本,但实际上不在模式中包含逗号的内容

解析验证分开

有很多很好的模块可以解析csv,比如和。尽管解析CSV看起来很容易,而且在很多情况下可能很容易,但您应该养成始终使用这些模块的习惯

然后,在成功解析数据之后,您可以输入一个需求,例如值列表的状态:

if (grep {$state eq $_} qw(WA QLD NSW VIC SA NT TAS)) {

谢谢你,米勒。我使用
Text::CSV
进行初始解析,但后来我发现CSV字段中有逗号分隔的列表。我的计划不是再次解析字段,而是集中在一些数据上,再次解析字段。或者,如果该列是一个简化的逗号分隔列表,那么您可以只使用
拆分
。即使您的专栏需要额外的处理,您仍然应该坚持使用CSV解析器的原因,请阅读今天的类似问题: