2015-07-21 56 views
0

我使用下面的代码进行拆分。我怎样才能拆分“,”即使它有一个“,”在其中

List<String> separatedStringList = Arrays.asList(line.split(",")); 

然后我解析字符串存储到

ArrayList<String> tags; 
ArrayList<String> values; 

但是,当我有如下一行:

abc: def,xyz: pqr, uvw: abchash<class qwerty,struct Hash<class qwerty>,struct std::equal_to<class qwerty> >::resize 

上的分裂“”引起uvw: abchash<class qwerty, struct Hash<class qwerty>, struct std::equal_to<class qwerty>>::resize问题部分。

如何解决这个问题?

在延续的问题here

+0

你的问题是有点混乱。你说你不想拆分uvw:abchash ,struct std :: equal_to > resize part? – JFPicard

+0

@JFPicard - 这是正确的。由于uvw的值是整行,直到调整大小,我需要它作为值,而不是直到第一个“,”。 – Vidya

+0

我的回答对你的问题有帮助吗?如果是,请标记为已解决。 –

回答

0

评估您的字符串,其基于堆栈的算法为通用类型约束如下:

代码

final String text = "abc: def,xyz: pqr, uvw: abchash<class qwerty,struct Hash<class qwerty>,struct std::equal_to<class qwerty> >::resize"; 

int start = 0; 
Stack<Character> generics = new Stack<>(); 
for (int i = 0; i < text.length(); i++) { 
    char c = text.charAt(i); 
    switch (c) { 
     case '<': 
      generics.push(c); 
      break; 
     case '>': 
      if(generics.isEmpty() || generics.pop() != '<') { 
       throw new IllegalArgumentException("Invalid generic type constraints"); 
      } 
      break; 
     case ',': 
      if (generics.isEmpty()) { 
       System.out.println(text.substring(start, i)); 
       start = i + 1; //move window 
      } 
      break; 
    } 
} 
if (generics.isEmpty()) { 
    System.out.println(text.substring(start)); 
} 

输出

abc: def 
xyz: pqr 
uvw: abchash<class qwerty,struct Hash<class qwerty>,struct std::equal_to<class qwerty> >::resize 

个Futher改进
上面的代码可以写成一个Iterable

public static Iterator<String> iterateValues(String text) { 
    return new Iterator<String>() { 
     int start = 0; 
     Stack<Character> generics = new Stack<>(); 

     @Override 
     public boolean hasNext() { 
      return start <= text.length(); 
     } 

     @Override 
     public String next() { 
      for (int i = start; i < text.length(); i++) { 
       char c = text.charAt(i); 
       switch (c) { 
        case '<': 
         generics.push(c); 
         break; 
        case '>': 
         if (generics.isEmpty() || generics.pop() != '<') { 
          throw new IllegalArgumentException("Invalid generic type constraints"); 
         } 
         break; 
        case ',': 
         if (generics.isEmpty()) { 
          String result = text.substring(start, i); 
          start = i + 1; //move window 
          return result; 
         } 
         break; 
       } 
      } 
      String result = text.substring(start); 
      start = text.length() + 1; //move window 
      return result; 
     } 
    }; 
} 
0

您可以分割上“”并检查4字符是‘:’。在这种情况下,你把数组,如果没有,你把阵列和其他...

像这样:

String[] parts = string.split(","); 
int i = 0; 
while (i < parts.length) { 
    if (parts[i].charAt(4) == ':') { 
    //Do something with parts[i] 
    i++; 
    } 
    else { 
    String wantedPart = parts[i]; 
    i++; 
    while(parts[i].charAt(4) != ':' && i < parts.length) { 
     wantedPart = wantedPart + "," + parts[i]; 
     i++; 
    } 
    //Do something with wantedPart 
    } 
} 

这是一般的想法。当然,如果wantedPart很大,你可能会想要使用一个StringBuilder。

+0

我假设给定的字符串只是一个例子,并且在第四个位置并不总是有一个':'。我敢肯定,你会得到一个ArrayIndexOutOfBoundsException这个代码 - while while循环在while循环中循环相同的事情不是一个好的设计。你需要插入错误地将''''移回到字符串中。 – Dukeling

+0

我试着让它快速,但你是对的,我的第二个循环可能会抛出一个ArrayIndexOutOfBounds。我纠正了它。对于',',你的权利也。 – JFPicard

0

如果我正在阅读这个权利,你得到的问题是一个格式不正确的输入字符串,你在键值对的值部分有一个','。

所以你希望你的输入

abc: def,xyz: pqr, uvw: abchash<class qwerty,struct Hash<class qwerty>,struct std::equal_to<class qwerty> >::resize 

解析到

abc: def 
xyz: pqr 
uvw: abchash<class qwerty,struct Hash<class qwerty>,struct std::equal_to<class qwerty> >::resize 

但是,相反它的解析来

abc: def 
xyz: pqr 
uvw: abchash<class qwerty 
struct Hash<class qwerty> 
struct std::equal_to<class qwerty> >::resize 

对此的解决方案是修复您的输入值引用整个值字符串或使用其他分隔符给你一些规则。

据我可以告诉你基本上没有关于你进入的规则。它可以是一个关键:值对或只是一个值,就像你在另一个问题中的例子。在这种情况下,不可能区分包含逗号的值与一个值的结尾和另一个值的开始之间的差异。你说这该字符串

abc:xyz uvw, def:ghi, mno:rst, ijk:efg, abc opq 

应解析成

abc:xyz uvw 
def:ghi 
mno:rst 
ijk:efg 
abc opq <-- no key, just a value 

这意味着该

abc: def,xyz: pqr, uvw: abchash<class qwerty,struct Hash<class qwerty>,struct std::equal_to<class qwerty> >::resize 

可以解析到

abc: def 
xyz: pqr 
uvw: abchash<class qwerty,struct Hash<class qwerty>,struct std::equal_to<class qwerty> >::resize 

或同样

abc: def 
xyz: pqr 
uvw: abchash<class qwerty 
struct Hash<class qwerty>,struct std::equal_to<class qwerty> >::resize 

或同样

abc: def 
xyz: pqr 
uvw: abchash<class qwerty 
struct Hash<class qwerty> 
struct std::equal_to<class qwerty> >::resize 

等等等等

当你有你需要输入改变以某种方式让你缩小正确的正则表达式用多个同样有效的答案。