我正在使用 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
本身将被删除。)
我应该怎么办?
您需要使用积极的前瞻。
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
。后面+
的}
所有格量词不会让正则表达式引擎回溯,从而匹配最大可能的值。
归档时间: |
|
查看次数: |
179 次 |
最近记录: |