我正在将一个字符串 "foo,bar,c;qual="baz,blurb",d;junk="quux,syzygy"" 按逗号分隔,但想要保留引号内的逗号。这个问题在这个Java: splitting a comma-separated string but ignoring commas in quotes问题中得到了回答,但它没有完全解释作者是如何创建这段代码的,这段代码是:
line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)", -1);
好的,我理解了一些情况,但有一点让我感到困惑。我知道第一个逗号是用来匹配的。
然后
(?=
是一种正向搜索。
然后第一部分被分组。
([^\"]*\"[^\"]*\").
这是我感到困惑的地方。所以第一部分是……
[^\"]*
意味着以引号开头的任何行都会将标记分隔为零个或多个。
然后是 \". 现在这是像在字符串中打开引号还是表示匹配此引号?
然后它重复了完全相同的代码行,为什么?
([^\"]*\"[^\"]*\")
在第二部分,再次添加相同的代码以解释它必须以引号结束。
有人能解释一下我没有理解的部分吗?
^
表示非。反斜杠加双引号\"
表示"
,但反斜杠是转义字符。因此,[^\"]*
匹配不包含"
的任何字符串。 - M. Shaw[^\"]*
匹配任何字符但不包括“`”,零或多次。 - Avinash Raj[^\"]
表示任何不包含"
的字符串。\"
匹配"
。因此,([^\"]*\"[^\"]*\")
匹配一个包含两个"
并且最后一个字符是"
的字符串。 - M. Shaw"
的字符串。 - M. Shaw