2015-10-14 89 views
3

我见过很多例子,但我没有得到预期的结果。拆分字符串使用逗号,但忽略逗号,如果它是括号或引号

给定一个字符串:

"manikanta, Santhosh, ramakrishna(mani, santhosh), tester" 

我想获得字符串数组如下:

manikanta, 
Santhosh, 
ramakrishna(mani, santhosh), 
tester 

我试过以下的正则表达式(从另一个例子中得到):

"(\".*?\"|[^\",\\s]+)(?=\\s*,|\\s*$)" 
+0

我复制从JavaScript例如正则表达式,但我的问题是JA va only –

+0

只是忽略了正则表达式的例子输入字符串就是我给出的,我想得到下面的输出 –

+2

好的问题,但它会更好/更舒服,如果你给一个最小的代码示例,就像一个类只有输入字符串和解析/分割和输出代码的主要方法。或者甚至是一个junit测试用例。 – hoijui

回答

2

这确实这一招分割的一部分:

String[] parts = input.split(", (?![^(]*\\))"); 

其采用负先行断言下一托架炭闭括号,并且产生:

manikanta 
Santhosh 
ramakrishna(mani, santhosh) 
tester 

所需的输出按您的问题一直尾随逗号,我以为是一个疏忽,但如果你确实想保持逗号:

String[] parts = input.split("(?<=,) (?![^(]*\\))"); 

产生相同但尾随逗号完整:

manikanta, 
Santhosh, 
ramakrishna(mani, santhosh), 
tester 
-1

正如我在对问题的评论中指出的那样,这个问题可能无法通过正则表达式来解决。

下面的代码(JAVA)给出了一个暗示做什么:

private void parse() { 
    String string = null; 
    char[] chars = string.toCharArray(); 
    List<String> parts = new ArrayList<String>(); 

    boolean split = true; 
    int lastEnd = 0; 
    for (int i = 0; i < chars.length; i++) { 
     char c = chars[i]; 
     switch (c) { 
     case '(': 
      split = false; 
      break; 
     case ')': 
      split = true; 
      break; 
     } 
     if (split && c == ',') { 
      parts.add(string.substring(lastEnd, i - 1)); 
      lastEnd = i++; 
     } 
    } 
} 

注意,代码缺少约束一些检查(提供的字符串为null,数组边界,...)。

+0

那么,[它可能与正则表达式](http://stackoverflow.com/a/33121440/256196) – Bohemian

0

假设,我们可以用空格分开(由于您的例子),那么你可以尝试这个表达式\s+(?=([^\)]*\()|([^\)\(]*$))像:

String str = "manikanta, Santhosh, ramakrishna(mani, santhosh), ramakrishna(mani, santhosh), tester"; 
String[] ar = str.split("\\s+(?=([^\\)]*\\()|([^\\)\\(]*$))"); 

其中:

\s+任意数量的空格的

(?=...)积极向前,意味着在当前位置必须是字符串后,与([^\\)]*\\()|([^\\)\\(]*$)

([^\\)]*\\()忽略空格内(和)

([^\\)\\(]*$))所有的空格,如果他们不跟(和),这里使用的tester

相关问题