我在CSV文件中遇到的常见情况是查找特定字段,然后在该字段之前或之后立即捕获该字段。例如,在下面的CSV行中,我的正则表达式正在寻找状态字段'NSW',但我还需要捕获周围的字段:
So Cross Univ, Sch Environm Sci & Engn, Lismore, NSW 2480
这是我到目前为止的尝试:
(?P<city>([^,]*?))(?P<state>\b(WA|QLD|NSW|VIC|SA|NT|TAS)\b)
它捕捉的是州而不是城市。
这里,场景是一个地址,但情况可能并非总是如此。所以,我正在尝试提出一个通用的正则表达式,它将搜索CSV字段并捕获任意一侧的字段。
还有其他人遇到过这个吗?
答案 0 :(得分:2)
将解析与验证分开。
有许多好的模块用于解析csv,例如Text::CSV
和Text::CSV_XS
。尽管解析CSV看起来很简单并且在很多情况下可能很容易,但您应该养成始终使用这些模块的习惯。
然后,在您成功解析数据之后,您可以引入一个需求,例如状态是一个值列表:
if (grep {$state eq $_} qw(WA QLD NSW VIC SA NT TAS)) {
答案 1 :(得分:1)
正在捕获city
的字符串 - 正如您指定的那样。当我尝试你的正则表达式时,我得到了' '
这个城市,如果你在没有分隔符的情况下打印出值,你可能会错过这个城市。
您的正则表达式不允许使用逗号:非逗号字符串不是逗号,也不是state
的任何已定义值。因此,你的正则表达式捕获它唯一的字符串,一个字符串之前的非逗号,一个空格。你没有说它不是一个空格,你只是说它不能包含逗号。
/(?P<city>([^,]*?)),\s*(?P<state>\b(WA|QLD|NSW|VIC|SA|NT|TAS)\b)/
的工作原理。
是的,即使是老职业选手也可以每天,看到没有捕捉我们认为我们指定的内容的问题,但我们实际指明了什么。知道如何调试正则表达式以及如何打印完全你正在捕获的东西,只有一半的战斗。当然,正则表达式丛林中的经验也可以帮助您发现在逗号两边查找文本的内容,但实际上并不包括模式中的逗号。