拆分引号外的逗号

新手上路,请多包涵

我的程序从文件中读取一行。此行包含以逗号分隔的文本,例如:

 123,test,444,"don't split, this",more test,1

我希望拆分的结果是这样的:

 123
test
444
"don't split, this"
more test
1

如果我使用 String.split(",") ,我会得到这个:

 123
test
444
"don't split
 this"
more test
1

换句话说:子字符串中的逗号 "don't split, this" 不是分隔符。如何处理?

原文由 Jakob Mathiasen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 676
2 个回答

你可以试试这个正则表达式:

 str.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");

这会将字符串拆分为 , 后跟偶数个双引号。换句话说,它在双引号外用逗号分隔。如果您的字符串中有平衡引号,这将起作用。

解释:

 ,           // Split on comma
(?=         // Followed by
   (?:      // Start a non-capture group
     [^"]*  // 0 or more non-quote characters
     "      // 1 quote
     [^"]*  // 0 or more non-quote characters
     "      // 1 quote
   )*       // 0 or more repetition of non-capture group (multiple of 2 quotes will be even)
   [^"]*    // Finally 0 or more non-quotes
   $        // Till the end  (This is necessary, else every comma will satisfy the condition)
)

您甚至可以在您的代码中使用 (?x) 修饰符和您的正则表达式来键入这样的内容。修饰符会忽略正则表达式中的任何空格,因此更容易阅读分成多行的正则表达式,如下所示:

 String[] arr = str.split("(?x)   " +
                     ",          " +   // Split on comma
                     "(?=        " +   // Followed by
                     "  (?:      " +   // Start a non-capture group
                     "    [^\"]* " +   // 0 or more non-quote characters
                     "    \"     " +   // 1 quote
                     "    [^\"]* " +   // 0 or more non-quote characters
                     "    \"     " +   // 1 quote
                     "  )*       " +   // 0 or more repetition of non-capture group (multiple of 2 quotes will be even)
                     "  [^\"]*   " +   // Finally 0 or more non-quotes
                     "  $        " +   // Till the end  (This is necessary, else every comma will satisfy the condition)
                     ")          "     // End look-ahead
                         );

原文由 Rohit Jain 发布,翻译遵循 CC BY-SA 3.0 许可协议

为什么在可以匹配时拆分?

重新提出这个问题是因为出于某种原因,没有提到简单的解决方案。这是我们精美紧凑的正则表达式:

 "[^"]*"|[^,]+

这将匹配所有需要的片段( 参见演示)。

解释

  • 使用 "[^"]*" ,我们匹配完整 "double-quoted strings"
  • |
  • 我们匹配 [^,]+ 任何不是逗号的字符。

一种可能的改进是改进交替的字符串端,以允许带引号的字符串包含转义引号。

原文由 zx81 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题