1

我正在尝试在数字之间添加空格,但结果是某些数字会被拆分,而其他数字有时会丢失。

代码:

String line = "321HELLO how do you do? $ah213 -20d1001x";
line = line.replaceAll("([^d]?)([\\d\\.]+)([^d]?)", "$1 $2 $3");
System.out.println(line);

结果:

3 21 HELLO how do "you" do? $ah 213  - 2 0 d1 001 x

规则:

无论整数有多大,都不要将它分成许多部分。$ + 数字 ($123) 或 $ +字母 + 数字 ($abc123) 不要在数字前后添加空格。字母+数字=分开。

想要的结果:

321 HELLO how do "you" do? $ah213 -20 d 1001 x
4

1 回答 1

3

正则表达式中的一个小错误:[^d]应该是[^\\d],否则您正在检查字符d而不是字符类\d

但它仍然插入了太多空格,我真的没有看到用你当前的正则表达式来避免这种情况的方法。

有效的东西:

String line = "321HELLO how do you do? $ah213 -20d1001x";
line = line.replaceAll("(?<=[-\\d.])(?=[^\\s-\\d.])|(?<!\\$[a-z]{0,1000})(?<=[^\\s-\\d.])(?=[-\\d.])", " ");
System.out.println(line);

印刷:

321 HELLO how do you do? $ah213 -20 d 1001 x

解释:

[-\\d.]是我认为您将其归类为“数字的一部分”的内容(尽管.单独的 a 将被视为数字,这可能不是我们所希望的)(您不需要在.里面转义[])。
(?<=...)是正向后看,表示前面的字符与模式匹配。
(?=...)是积极的前瞻,意味着下一个字符匹配模式。
(?<!...)是消极的后视,意味着前面的字符与模式不匹配。

所以基本上每当你到达一个在数字和非数字之间切换点的地方,插入一个空格(如果一个不存在的话)。$并且,当后面有 0-1000(不能*在后视中使用)字母时,负后视会阻止插入空格(将防止空格与$123$ah123)。

Java 正则表达式参考

附加说明:

事实证明你根本不需要?<=,这可以定期匹配。

replaceAll("([-\\d.])(?=[^\\s-\\d.])|(?<!\\$[a-z]{0,1000})([^\\s-\\d.])(?=[-\\d.])", "$1$2 ")
于 2013-06-05T08:15:12.660 回答