使用替代逗号(,)拆分字符串

时间:2013-05-06 16:23:26

标签: java string split tokenize

我知道如何对String进行标记,但问题是我想将其标记为如下所示。

String st = "'test1, test2','test3, test4'";

我尝试的内容如下:

st.split(",");

这给我的输出为:

'test1
test2'
'test3
test4'

但我希望输出为:

'test1, test2'
'test3, test4'

我该怎么做?

2 个答案:

答案 0 :(得分:3)

由于单引号为not mandatorysplit将无效,因为Java的正则表达式引擎不允许使用可变长度的lookbehind表达式。这是一个使用正则表达式匹配内容的简单解决方案,而不是分隔符:

String st = "'test1, test2','test3, test4',test5,'test6, test7',test8";
Pattern p = Pattern.compile("('[^']*'|[^,]*)(?:,?)");
Matcher m = p.matcher(st);
while (m.find()) {
    System.out.println(m.group(1));
}

Demo on ideone

您可以通过更改引用子字符串的“内容”部分来添加转义单引号的语法(当前,它是[^']*,意思是“除了单引号重复零次或多次之外的任何内容”。

答案 1 :(得分:1)

最简单可靠的解决方案是使用CSV解析器。也许Commons CSV会有所帮助。

它将根据CSV规则对字符串进行扫描。因此,即使''可以在值中使用而不会破坏它。

示例代码如下:         ByteArrayInputStream baos = new ByteArrayInputStream(“'test1,test2','test3,test4'”。getBytes());

    CSVReader reader = new CSVReader(new InputStreamReader(baos), ',', '\'');

    String[] read = reader.readNext();
    System.out.println("0: " + read[0]);
    System.out.println("1: " + read[1]);

    reader.close();

这将打印:

0: test1, test2
1: test3, test4

如果您使用maven,则只需导入依赖项:

    <dependency>
        <groupId>net.sf.opencsv</groupId>
        <artifactId>opencsv</artifactId>
        <version>2.0</version>
    </dependency>

然后开始使用它。