【问题标题】:How can I advoice splitting integer?如何建议拆分整数?
【发布时间】:2013-05-31 19:55:49
【问题描述】:

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

代码:

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

【问题讨论】:

  • 为什么$ah213这里没有空格,这段代码是怎么形成的d 1001 x?我的意思是我希望它是d 1 001 x ?
  • @HamZa,您的逻辑解释是正确的,因为我没有提供足够的信息。添加了更多信息,对不起。

标签: java regex split spaces


【解决方案1】:

您的正则表达式中有一个小错误:[^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.] 是我认为您将其归类为“数字的一部分”(尽管 . 单独将被视为数字,这可能不是我们所希望的)(您无需转义 .[]) 内。
(?&lt;=...) 是正向后视,意味着前面的字符与模式匹配。
(?=...) 是正向预视,意味着下一个字符与模式匹配。
@ 987654334@ 是否定的look-behind,表示前面的字符与模式不匹配。

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

Java regex reference.

补充说明:

原来你根本不需要?&lt;=,这可以定期匹配。

replaceAll("([-\\d.])(?=[^\\s-\\d.])|(?<!\\$[a-z]{0,1000})([^\\s-\\d.])(?=[-\\d.])", "$1$2 ")

【讨论】:

  • 刚刚添加了解释为什么它不应该分开$ah213
  • @user1768615 对于第二个正则表达式?不。括号中的唯一组/事物是([-\\d.])([^\\s-\\d.])(环顾四周不是捕获组)。请注意,由于|,只会填充其中一个,但如果未填充组,则它将为空白,因此添加两者都可以。正则表达式匹配的字符串部分不包含前瞻(已检查但未包含),因此它们不需要/无法替换。
猜你喜欢
  • 2011-11-22
  • 1970-01-01
  • 2017-05-03
  • 1970-01-01
  • 1970-01-01
  • 2013-03-21
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多