8

我已经能够从GAWK 的 GNU 页面了解它可以使用FPAT变量处理数据中的分隔符,但我无法弄清楚它是如何工作的。对于 CSV 文件,FPAT 值为:

FPAT = "([^,]+)|(\"[^\"]+\")"

使用数据:

abc,"pqr,mno"

第一个分组表达式计算所有内容,即不是逗号,这应该"abc"作为数据,然后在第一次出现逗号时失败。现在我的问题是接下来会发生什么?由于第一个分组表达式失败,正则表达式是否会使用 or 条件从逗号后的字符继续?但是第一个分组表达式对逗号后的所有数据仍然有效,因此它可能会"pqr作为下一个数据?

4

1 回答 1

8

因此场模式描述如下。

不包含逗号且字符串长度大于零的字符串(不匹配空字符串)

[^,]+

或者以双引号开头和结尾并包含至少一个不是双引号的字符的字符串(为了便于阅读,省略了转义反斜杠)

"[^"]+"      

正则表达式引擎从字符串的开头匹配并尝试尽可能多地匹配给定的模式。

abc,"pqr,mno" 

因此abc,最长的字符串与字符串开头的任一模式匹配,因此变为$1. 下一个字符,不能被任一模式匹配,因此正则表达式引擎只是移动到下一个字符",开始匹配第二个模式。这匹配到行尾,因为"pqr,mno"它是一个以双引号开始和结束并包含至少一个非双引号字符的字符串。因此"pqr,mno"成为$2备案abc,"pqr,mno"

于 2013-10-15T10:51:13.843 回答