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

How to split a string without losing any word in Java?

我正在为 Java 使用 eclipse。

我想在不丢失任何字符的情况下拆分输入行。

例如输入行是:

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 本身将被删除。)

我该怎么办?

您需要使用正向预测。

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

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]

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