在学习Java课程时,我遇到了以下代码:
String[] columns = row.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
检查documentation of the split method可以理解,在括号之间有一个正则表达式字符串。
检查documentation of regexp时,事情变得更加棘手:
将表达式拆分成我在the said documentation中找到的片段:
-
,
-我们期望字符串被分隔的字符 -
(
-在第16点关闭 -
?=
-(?= X)X,通过零宽度正向超前搜索 -
(
-在第11点关闭 -
[^\"]
-除“ ” » 外的任何字符
-
*
-我不明白 -
\"
-字符«“ » -
[^\"]
-再次,如第5点,除«“ » 以外的任何字符
-
*
-同样,就像第6点一样,我不确定我能得到这个 -
\"
-同样,就像第7点一样,字符«“ » -
)
-关闭从第4点开始的表达式 -
*
-这是某种逻辑与吗? -
[^\"]
-与第5点和第8点一样,除了“ ” » 以外的任何字符
-
*
-与第6、9和12点相同 -
$
-指示行尾的边界匹配器 -
)
-关闭从第2点开始的表达式
我不正确地理解第3点,因为我不理解什么是前瞻。我可以使用this answer来了解它的要点,它使用this website作为参考,在这里我们可以了解正面和负面的前瞻:
负向超前是必不可少的,如果您想匹配不跟其他的内容。在解释字符类时,本教程说明了为什么不能使用否定的字符类来匹配q而不是u。负前瞻提供了解决方案:q(?!u)。否定的超前构造是一对圆括号,其中圆括号开头是问号和感叹号。在前瞻内部,有一个琐碎的正则表达式u。
正向超前工作原理相同。 q(?= u)匹配后跟au的aq,不使u成为匹配项。。正向超前构造是一对括号,括号内是开括号。一个问号和一个等号。
您可以在超前使用任何正则表达式(但不能向后看,如下所述)。可以在lookahead内部使用任何有效的正则表达式。
好,现在第3点已经理解为种类,到目前为止,我得到的是我们正在尝试使用字符«,»(第1点),然后是表达式([^\"]*\"[^\"]*\")*[^\"]*$
。
在这一点上,我被认为是一个问题: *如何在Java的正则表达式中凝聚表达式?
查看documentation时,我发现了它的三个实例,但仍然没有得到它:
- 在贪婪量词中,X * X等于或大于零次;
- 在勉强的量词中,X *? X,零次或多次
- 在所有数量词中,X * + X零次或多次
如果我的推论有误,请纠正我,并感谢您的宝贵时间。