【问题标题】:Trim all zeros before and after decimal Regex修剪小数点正则表达式前后的所有零
【发布时间】:2016-12-14 18:42:47
【问题描述】:

Objective-C:我想删除所有尾随和领先的零,但有一些例外。例如:

0.05000 -> 0.05
000.2300 -> 0.23
005.0 -> 5
500.0 -> 500
60.0000 -> 60
56.200000 -> 56.2
56.04000 -> 56.04

我尝试的是这样的[.0]+$|(^0+)。但这对我想要实现的目标没有帮助。我正在使用带有 RegularExpressionSearch 的 NSString,如下所示:

 NSString *cleaned = [someString stringByReplacingOccurrencesOfString:@"[.0]+$|(^0+)"
                                                                           withString:@""
                                                                              options:NSRegularExpressionSearch
                                                                                range:NSMakeRange(0, self.doseTextField.text.length)];

任何帮助将不胜感激。

【问题讨论】:

标签: objective-c regex nsstring


【解决方案1】:

有时最好将任务分解,按顺序尝试这些,每次替换字符串为@""

  1. @"^0+(?!\\.)" - 0 的初始序列 not 后跟一个点。这会将“003.0”修剪为“3.0”,将“000.3”修剪为“0.3”。

  2. @"(?<!\\.)0+$" - 一个尾随的零序列前面有一个点。所以“3.400”转到“3.4”,“3.000”转到“3.0”

  3. @\\.0$ - 删除尾随的“.0”。前两个 RE 可能会为您留下“.0”故意,以便您可以在此步骤中删除点。

这不是分解它的唯一方法,但三个基本任务是删除前导零、删除尾随零和清理。您也根本不需要使用 RE,一个简单的有限状态机可能是一个不错的选择。

重要提示:以上假设字符串包含小数点,如果它可能不需要您也需要处理(留作练习)。

HTH

【讨论】:

  • 将问题分解为可理解、可测试的部分的好建议——六个月后我非常感谢这种事情!
  • 由于这似乎是一个很好的做法,现在我将使用 Wiktor 对单行正则表达式的回答。即或尝试将"^(0)+(?=\\.)|^0+(?=[1-9])|\\.0+$|(\\.\\d*?)0+$" 替换为$1$2。或分组:"^(?:(0)+(?=\\.)|0+(?=[1-9]))|(?:\\.0+|(\\.\\d*?)0+)$"
【解决方案2】:

这样的?

let numberStrings = [
    "0.05000",
    "000.2300",
    "005.0",
    "500.0",
    "60.0000",
    "56.200000",
    "56.04000"
]

print(numberStrings.map({
    String(Double($0)!).stringByReplacingOccurrencesOfString("\\.0*$", withString: "", options: .RegularExpressionSearch, range: nil)
}))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-22
    相关资源
    最近更新 更多