如何拆分字符串而不丢失Java中的任何单词?

时间:2015-03-30 09:10:29

标签: java string split

我正在使用eclipse for Java。

我想分割输入行而不会丢失任何字符。

例如输入行是:

MAC 4 USD7MAIR 2014 USD1111IMAC 123 USD232MPRO 2-0-1-5

输出应为:

MAC 4 USD7,MAIR 2014 USD1111,IMAC 123 USD232,MPRO 2-0-1-5

(如果我与"M"等分开,则会删除字符M本身。)

我该怎么办?

1 个答案:

答案 0 :(得分:4)

你需要使用积极的前瞻。

string.split("(?=M)");

OR

string.split("(?<!^)(?=M)");

示例:

String totalString = "MAC 4 USD7MAIR 2014 USD1111IMAC 123 USD232MPRO 2-0-1-5";
String[] parts = totalString.split("(?=M)");
System.out.println(Arrays.toString(parts));

输出:

[MAC 4 USD7, MAIR 2014 USD1111I, MAC 123 USD232, MPRO 2-0-1-5]

<强>更新

以下正则表达式会根据USD\d+之后立即存在的边界拆分输入,\d+这里表示一个或多个数字。

String totalString = "MAC 4 USD7MAIR 2014 USD1111IMAC 123 USD232MPRO 2-0-1-5";
String[] parts = totalString.split("(?<=\\bUSD\\d{1,99}+)");
System.out.println(Arrays.toString(parts));

输出:

[MAC 4 USD7, MAIR 2014 USD1111, IMAC 123 USD232, MPRO 2-0-1-5]

(?<=...)称为正面后瞻断言。在支持可变长度lookbehind(C#)的语言中,您可以使用(?<=\\bUSD\\d+)。但不幸的是,java不支持可变长度的后视。因此,我们定义数字,例如允许\d{1,99}数字从1到99表示后期到USD +数字到99。而+之后的}称为占有量词,它不会让正则表达式引擎回溯,从而匹配最大可能的值。