【问题标题】:Modifying part of a regex in replaceAll call在 replaceAll 调用中修改正则表达式的一部分
【发布时间】:2018-09-07 01:37:22
【问题描述】:

我正在尝试使用正则表达式格式化字符串,如下所示:

String string = "5.07+12.0+2.14";
string = string.replaceAll("\\.0[^0-9]","");

我认为会发生的是字符串会变成:

5.07+122.14 //the regex will delete the .0+ next to the 12

如何创建正则表达式,以便它只删除 .0 而不是 + 号?

我更愿意在同一个调用中完成所有操作来“replaceAll”

感谢任何建议

【问题讨论】:

  • 为什么 5.07 会变成 57,因为 .0 后面跟着一个数字 @CertainPerformance
  • 或者你可以使用负前瞻\.0(?!\d)

标签: java regex replaceall


【解决方案1】:

匹配的字符将被替换。因此,您可以使用前瞻来代替 匹配 最后的非数字,这将执行所需的检查,但不会消耗任何字符。此外,非数字的简写是\D,比[^0-9] 更易读:

String string = "5.07+12.0+2.14";
string = string.replaceAll("\\.0(?=\\D)","");

如果您想替换 所有 个尾随零(例如,将 5.00 替换为 5 而不是您可能不想要的 50),然后重复 0 一个或多次使用+ 以确保替换小数点后的所有零:

String string = "5.07+12.000+2.14";
string = string.replaceAll("\\.0+(?=\\D)","");

如果字符串从不包含字母或下划线_ 字符(这些字符和数字字符都算作单词字符),那么您可以使用单词边界而不是前瞻来使它更漂亮。单词边界,顾名思义,将匹配一个位置,一侧是单词字符,另一侧是非单词字符,\b

string = string.replaceAll("\\.0+\\b","");

【讨论】:

  • =号是什么意思?
  • (?= 是前瞻开始的语法。它检查以下模式是否匹配,但不使用任何字符。 (结束前瞻就像结束任何组一样,)
  • 所以它应该只替换第一组,而不是前瞻?
  • 右 - 前瞻不消耗任何字符,它只确保以下模式匹配。
  • 感谢您的提示。我将在 netbeans 中对其进行测试,然后为您的答案投票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
  • 2014-04-14
相关资源
最近更新 更多