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

jus*_*ink 3 java string split

我正在使用 Eclipse for Java。

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

例如输入行是:

MAC 4 USD7MAIR 2014 USD1111IMAC 123 USD232MPRO 2-0-1-5
Run Code Online (Sandbox Code Playgroud)

输出应该是:

MAC 4 USD7,MAIR 2014 USD1111,IMAC 123 USD232,MPRO 2-0-1-5
Run Code Online (Sandbox Code Playgroud)

(如果我用或等拆分"M",字符M本身将被删除。)

我应该怎么办?

Avi*_*Raj 5

您需要使用积极的前瞻。

string.split("(?=M)");
Run Code Online (Sandbox Code Playgroud)

或者

string.split("(?<!^)(?=M)");
Run Code Online (Sandbox Code Playgroud)

例子:

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

输出:

[MAC 4 USD7, MAIR 2014 USD1111I, MAC 123 USD232, MPRO 2-0-1-5]
Run Code Online (Sandbox Code Playgroud)

更新:

下面的正则表达式将根据紧随 to 之后存在的边界分割输入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));
Run Code Online (Sandbox Code Playgroud)

输出:

[MAC 4 USD7, MAIR 2014 USD1111, IMAC 123 USD232, MPRO 2-0-1-5]
Run Code Online (Sandbox Code Playgroud)

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