我正在尝试在数字之间添加空格,但结果有些数字会分裂而其他数字有时会丢失。
代码:
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
答案 0 :(得分: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.]
是我认为你将其归类为“数字的一部分”(尽管单独.
将被视为一个数字,这可能是不可取的)(你不需要在.
)内逃避[]
(?<=...)
是积极的后视,意味着之前的字符与模式匹配
(?=...)
是正向前瞻,意味着下一个字符与模式匹配
(?<!...)
是负面的后瞻,意味着之前的字符与模式不匹配。
所以基本上每当你到达一个数字而不是数字之间的转换点的地方时,插入一个空格(如果还不存在)。每当有$
后跟0-1000(不能在后面使用*
)字母时,负面的后视会阻止插入空格(将阻止空格{{1 }和$123
)。
附加说明:
原来你根本不需要$ah123
,这可以定期匹配。
?<=