Java - 解释这个正则表达式(“,(?=([^ \”] * \“[^ \”] * \“)* [^ \”] * $)“, - 1)

时间:2015-07-18 12:25:05

标签: java regex

我正在用逗号分隔字符串“foo,bar,c; qual =”baz,blurb“,d; junk =”quux,syzygy“”但是想在引号中保留逗号。这个问题在这个Java: splitting a comma-separated string but ignoring commas in quotes问题中得到了回答,但它无法完全解释海报如何创建这段代码:

line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)", -1);

好的,所以我确实了解了一些正在发生的事情,但有一点令我感到困惑。我知道第一个逗号用于匹配。

然后

        (?= 

是向前搜索。

然后第一部分被分组

  ([^\"]*\"[^\"]*\"). 

这让我感到困惑。所以第一部分

  [^\"]* 

表示带引号的任何行的开头将标记分开零次或多次。

然后来了\“。现在这就像在字符串中打开一个引用或者说这个引用匹配吗?

然后它重复完全相同的代码行,为什么?

      ([^\"]*\"[^\"]*\")

在第二部分中再次添加相同的代码来解释它必须用引号完成。

有人可以解释我没有得到的部分吗?

3 个答案:

答案 0 :(得分:3)

[^\"]是没有"的任何字符串。 \"比赛"。所以基本上([^ \"] * \" [^ \"] * \")匹配一个包含2 "的字符串,最后一个字符是{{ 1}}。

答案 1 :(得分:1)

我认为他们在答案后面做了很好的解释:

[^\"]与引号不匹配。 引用\"

所以这部分([^\"]*\"[^\"]*\")

  1. [^\"]*匹配除了引用0次或更多次
  2. \"匹配报价,是的,这是开头报价
  3. [^\"]*匹配除了引用0次或更多次
  4. \"匹配报价,收盘报价
  5. 他们只需要第一个[^\"]*,因为它们不以引号开头,它们的示例输入类似于a="abc",b="d,ef"。如果您正在解析"abc","d,ef",那么您将不需要它。

答案 2 :(得分:0)

这是你的字符串/,(?=([^ \"] \" [^ \"] \") [^ \"] $)/

这是https://regex101.com/

的读数
div.addMap {
height: 200px;
width:200px;
border-style: solid;
border-color: black;
}

div#targetDiv {
height: 100px;
width:100px;
border-style: solid;
border-color: yellow;
text-align: center;
}