【问题标题】:Replace all occurrences of group替换所有出现的组
【发布时间】:2015-05-26 09:50:42
【问题描述】:

我想替换字符串中所有出现的组。

String test = "###,##.##0.0########";
System.out.println(test);
test = test.replaceAll("\\.0(#)", "0");
System.out.println(test);

我试图获得的结果是###,##.##0.000000000 基本上,我想替换所有.0 后面的# 符号。 我找到了this about dynamic replacement,但我真的无法让它发挥作用。

最佳解决方案不会考虑要替换的哈希数(如果这样可以消除任何混淆)。

【问题讨论】:

  • 所以你想把.0之后的所有#替换成0
  • @npinti 。是的,对不起,我已经添加了解释。
  • 输入字符串中可以有多少个哈希符号可以替换为0?无限,或者说,一百?
  • 好吧,现在它大约是 4 或更少,但如果它是关于无限哈希符号的解决方案,我会更喜欢。
  • -(int)PI/3: 没有足够的正则表达式!

标签: java regex replaceall


【解决方案1】:
#(?!.*\\.0)

你可以试试这个。替换为0。查看演示。

https://regex101.com/r/yW3oJ9/12

【讨论】:

  • 如果我理解正确,它是这样的:替换每个 # 但丢弃前面的所有 .0 。你能解释一下?!吗?
  • @alkis ?! 是负前瞻。它将替换前面没有.0 的每个#
【解决方案2】:

您可以使用简单的正则表达式来完成您的任务。

#(?=#*+$)

(?=#*+$) = 一个正数 look-ahead,用于检查字符串 $ 之前有 0 个或多个 # 符号的任何 #编辑:我现在使用possessive quantifier *+ 来避免任何性能问题。

demo

IDEONE:

String test = "###,##.##0.0###########################################";
test = test.replaceAll("#(?=#*+$)", "0");
System.out.println(test);

【讨论】:

  • 很好的解决方案,感谢您的解释。当然赞成
  • 很高兴为您提供帮助。我还认为您甚至可以通过使用所有格量词来进一步优化这一点:#(?=#*+$)。我编辑了答案。
  • 性能在这里不是问题,因为我们讨论的是小字符串,但仍然很高兴知道其中的区别。是否可以逐步解释正则表达式操作?虽然答案解决了我的问题,但如果材料存在那就太好了(教别人钓鱼......)
  • 我最早有一个回溯的答案,但你说你考虑无限数量的#。所以,我不得不想一个不同的方法。我还为您提供了一些“学习钓鱼”的链接:)
  • (?=#) 正在检查后面是否有 # 符号。 (?=#*$) 将检查字符串结尾之前是否有 0 个或多个 # 符号,但将在每次匹配后存储回溯信息。 #*+ 不会存储可以大大提高性能并避免catastrophic backtracking 的回溯信息。
【解决方案3】:

您可以将文本拆分为“0.0”并仅替换第二部分:

String[] splited = "###,##.##0.0########".split("0.0");
String finalString = splited[0] + "0.0" + splited[1].replaceAll("#","0");

【讨论】:

  • 我更喜欢正则表达式解决方案。对不起,如果我不够清楚。这是有效的,所以赞成。
猜你喜欢
  • 2018-04-05
  • 2016-01-15
  • 1970-01-01
  • 2017-03-20
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多