2017-06-19 55 views
2

第一件事,第一,这里是我的代码:为什么不在此代码尊重我的最后的分割模式

String line = "Events|1005435529|7021370073||PAGELOAD|2017-06-19T12:04:40||JI||ServerHostName|ServerIPAddress|9P2_D2jB9Toct7PDTJ7zwLUmWfEYz6Y4akyOKn2g4CepveMH4wr3!46548593!1497854077121|||||||||||"; 
int offset = line.indexOf("Events"); 
String zeroIn = line.substring(offset); 
String[] jsonElements = zeroIn.split("\\|"); 
System.out.println(Arrays.asList(jsonElements)); 

输出:

[Events, 1005435529, 7021370073, , PAGELOAD, 2017-06-19T12:04:40, , JI, , ServerHostName, ServerIPAddress, 9P2_D2jB9Toct7PDTJ7zwLUmWfEYz6Y4akyOKn2g4CepveMH4wr3!46548593!1497854077121]` 

我也注意到空间添加到每个数组元素开始。

我的问题是我在字符串line的末尾有将近10个空管道符号,而空管线符号的第一个第二和第三个出现受到尊重,最后一个被错过并且不加在阵列。我在这里错过什么?

+1

你已经得到了有关空元素的答案。要回答另一个问题,*没有为每个数组元素添加额外的空格。它只是*打印*,以提高可读性。如果您打印单个元素,则会看到开头处没有空格。您还可以通过观察输出中的第一个元素“事件”来看到这一点。 – domsson

回答

3

split(java.lang.String regex)电话split(java.lang.String regex ,int limit)与参数0

如果n为零,则该模式将被应用多次,如 可能,阵列可以有任意长度,并且尾随空串 将被丢弃

您可以通过自己与正值调用此方法(和足够大,一定要包括所有的记号),以防止空令牌被丢弃:

String[] jsonElements = zeroIn.split("\\|", zeroIn.length()); 

注意:从下面的评论,使用负值的确是一个更好的方式来做到这一点:

String[] jsonElements = zeroIn.split("\\|", -1); 

如果n非POSI然后该模式将被应用多次,其数量可以是 ,并且该数组可以具有任何长度。

+3

由于您引用了文档,您应该使用负面限制。 – Flown

3

String从类和split方法doc:因此

尾随空字符串中不包括所得到的阵列英寸

因此,在最后一次出现非空字符串后,其余的将不会包含在数组中。

1

接受的答案解释了您在单个字符分隔符上分割的限制。我想我会提供这个答案,如果你需要在你的输出中保留空标记的能力。如果您使用环视来分割,例如一个回顾后,那么你最终会得到不同的条目,即使两个管道都没有在他们之间:

String line = "Events|1005435529|7021370073||PAGELOAD|2017-06-19T12:04:40||JI||ServerHostName|ServerIPAddress|9P2_D2jB9Toct7PDTJ7zwLUmWfEYz6Y4akyOKn2g4CepveMH4wr3!46548593!1497854077121|||||||||||"; 
String[] parts = line.split("(?<=\\|)"); 
for (String part : parts) { 
    System.out.println(part); 
} 

演示在这里:

Rextester

+0

我认为值得一提的是每个部分都会包含它的'|',因为它不再是分隔符。我也认为这就是为什么最后的部分将被返回(它们不再是空字符串)的原因,而不是不同的条目。 – Aaron

+0

我在很多负载下运行,而作为您的答案可能会解决我的问题,我认为添加'多个char'正则表达式会减慢我的程序。我没有测试过这个,但通过在互联网上的一般阅读,大于一个字符长度的分割模式被转换成与您的答案相同的正则表达式。 – User3

相关问题