基于逗号,奇怪线的分割线

时间:2014-04-08 12:30:01

标签: java regex

我将以下行逗号分隔,

LanguageID=0,LastKnownPeriod="Active",c_MultiPartyCall={Counter=1,TimeStamp=1394539271448},LTH={Data=["1|MTC|01.01.1970 15:00:00|0.0|7|-1|OnPeakAccountID|0|1000||","1|MTC|01.01.1970 15:00:00|0.0|7|-1|OnPeakAccountID|0|1000||"}

使用split方法,我可以获得逗号分隔值,但实际问题出现在文本c_MultiPartyCall={Counter=1,TimeStamp=1394539271448},因为在其中找到了逗号。

所以分裂后的单词应该是,

  • LanguageID=0
  • LastKnownPeriod="Active"
  • c_MultiPartyCall={Counter=1,TimeStamp=1394539271448}(再次在单词中找到逗号)
  • LTH={Data=["1|MTC|01.01.1970 15:00:00|0.0|7|-1|OnPeakAccountID|0|1000||","1|MTC|01.01.1970 15:00:00|0.0|7|-1|OnPeakAccountID|0|1000||"}(在大括号中的单词中再次找到逗号)

我尝试使用以下代码,但没有工作:

String arr[]=input_line.split("(.*!{),(.*!})");
for (int i=0;i<arr.length;i++)
    System.out.println(arr[i]);

请告知。

3 个答案:

答案 0 :(得分:1)

首先,只是分割逗号不是CSV的工作原理

a,b,"c,d"

只有三个值abc,d。我建议使用CSV解析器,例如opencsv。 CSV并不是非常复杂,但它并不像逗号分割那么简单。


其次,您的CSV数据无效,因为您在一个未引用的字段中有引号和逗号。

在其他方面,如果您想要值ab","c,那么CSV就是

a,"b"",""c"

(请注意引号是双重转义。)

否则,无法分辨出您真正想要的字段。 CSV解析器会阻塞您的数据。

答案 1 :(得分:1)

改为使用正则表达式:

([\w_]+=(?:\{[\w=_,\[\]"\|:\.\s-]*\}))|([^,]+)

这会将该行分为4个部分:

  • LanguageID = 0
  • LastKnownPeriod =&#34;主动&#34;
  • c_MultiPartyCall = {计数器= 1,时间戳= 1394539271448}
  • LTH = {Data = [&#34; 1 | MTC | 01.01.1970 15:00:00 | 0.0 | 7 | -1 | OnPeakAccountID | 0 | 1000 ||&#34;,&#34; 1 | MTC | 01.01.1970 15:00:00 | 0.0 | 7 | -1 | OnPeakAccountID | 0 | 1000 ||&#34;}

代码:

import java.util.regex.*;

public class JavaRegEx {
public static void main(String[] args) {
    String line = "LanguageID=0,LastKnownPeriod=\"Active\",c_MultiPartyCall={Counter=1,TimeStamp=1394539271448},LTH={Data=[\"1|MTC|01.01.1970 15:00:00|0.0|7|-1|OnPeakAccountID|0|1000||\",\"1|MTC|01.01.1970 15:00:00|0.0|7|-1|OnPeakAccountID|0|1000||\"}";

    Pattern pattern = Pattern.compile("([\\w_]+=(?:\\{[\\w=_,\\[\\]\"\\|:\\.\\s-]*\\}))|([^,]+)");
    Matcher matcher = pattern.matcher(line);

    while(matcher.find())
        System.out.println(matcher.group(0));

}
}

答案 2 :(得分:1)

虽然可以通过split()执行此操作,但匹配实际令牌(split()匹配令牌之间的分隔符更容易) )。你的标记都包含一个或多个除逗号或大括号之外的任何字符,后面还有一对大括号包含一些非大括号字符(可以包括逗号):

[^,{}]+(?:\{[^{}]+\})?

它的Java代码是:

List<String> matchList = new ArrayList<String>();
Pattern p = Pattern.compile("[^,{}]+(?:\\{[^{}]+\\})?");
Matcher m = p.matcher(s);
while (m.find()) {
    matchList.add(m.group());
} 

但看起来你可以进一步分解它:

Pattern p = Pattern.compile("(\\w+)=([^,{}]+|\\{[^{}]+\\})");
Matcher m = p.matcher(TEST_STR);
while (m.find()) {
    System.out.printf("%nname = %s%nvalue = %s%n",
                      m.group(1), m.group(2));
} 

输出:

name = LanguageID
value = 0

name = LastKnownPeriod
value = "Active"

name = c_MultiPartyCall
value = {Counter=1,TimeStamp=1394539271448}

name = LTH
value = {Data=["1|MTC|01.01.1970 15:00:00|0.0|7|-1|OnPeakAccountID|0|1000||","1|MTC|01.01.1970 15:00:00|0.0|7|-1|OnPeakA
ccountID|0|1000||"}