2014-02-21 98 views
1

我试图拆分字符串可以由用户指定的任何字符或字符分隔,例如逗号,分号和/或管道。为了清洁和灵活,我最好喜欢数组中的这些分隔符(无论是字符串还是字符或正则表达式,无论是否有效)。爪哇 - 分割字符串,可以是管道分隔(“\ I”),逗号分隔(“‘),分号分隔(’;”)和其他

String[] stringsToSplit = {"alpha,bravo,charlie", "delta;echo;foxtrot", "golf|hotel|india", "juliet\nkilo\nlima"}; 
String[] acceptedNonEscapedDelims = {"," , ";"}; 
String[] acceptedEscapedDelims = {"\\|" , "\\n"}; 

我只能让它使用硬编码的正则表达式工作。

String[] values = string.split("\\n|\\||\\t|,|;"); 

一些关于存储在一个字符串数组的正则表达式是使得下文中不起作用。

String[] values = string.split(acceptedEscapedDelims[0]); 

我可以为每个可能的分隔符,拆分使用每一个单独的硬编码一个布尔标志,但这种做法似乎是两轮牛车给我。对于这样一个简单的事情来说,它也是非常费力的。如果分别处理每个分隔符,则需要进行许多特殊处理:例如,测试字符串是否包含逗号(在尝试使用逗号分割之前),否则您将获得单个字符的数组元素。

+0

*问题1 *:可1串已经使用多个定界符(例如将' “A,B; C | d \ NE”'是有效的输入,如果有的话,它会被分成5个元素?)。 *问题2 *:数据实际上包含逗号的字符串会发生什么,例如'“'道尔顿,蒂莫西';'康纳利,肖恩';”'? –

+0

'的String []值= string.split(acceptedEscapedDelims [0]);'工作得很好:https://ideone.com/xLox9T – Keppil

回答

1

要拆分只与单个字符,所以也许尝试[abcde](“之一”)的形式,而不是a|b|c|d|e。演示:

System.out.println(Arrays.toString("a;b.c|d".split("[;.|]")));

输出:

[a, b, c, d]

+0

感谢这个killer_PL,我可以做你的建议,但据我看到的,这并不直接解决可配置性问题。我需要用户能够动态指定使用哪些分隔符。我可以得到分隔符并将它们存储在一个数组中,但它们不起作用。如何将delim数组的分隔符传递给正则表达式? – Julie

+0

@Julie通过'StringBuilder'实现concat分隔符。记得逃脱像'字符 “'或']'' –

+0

code'String [] regularDelims = {”, “ ”“}; 字符串[] escapedDelims = {” \\ |”, “\ n”}; String [] stringsToSplit = {“alpha,bravo,charlie”,“delta; echo; foxtrot”,“golf | hotel | india”,“juliet \ nkilo \ nlima”}; String allDelims =“[”; 为(字符串DELIM:regularDelims){ allDelims + =( “|” + DELIM); } 为(字符串DELIM:escapedDelims){ allDelims + =( “| \\” + DELIM); } allDelims + =“]”;'code' – Julie