我正在使用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
本身。)
我该怎么办?
答案 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
。而+
之后的}
称为占有量词,它不会让正则表达式引擎回溯,从而匹配最大可能的值。