这似乎很简单,但我错过了一些东西。
我有许多来自各种来源和不同格式的输入。
数字输入
123
123.45
123,45 (note the comma used here to denote decimals)
1,234
1,234.56
12,345.67
12,345,67 (note the comma used here to denote decimals)
有关输入的其他信息
- 数字将始终小于 100 万
- 编辑:这些是价格,所以要么是整数,要么是百分之 一
我正在尝试编写一个正则表达式并使用 gsub 去掉数千个逗号。我该怎么做?
我写了一个正则表达式:myregex = /d+(,)d{3}/
当我在 Rubular 中测试它时,它表明它仅在我想要的测试用例中捕获逗号。
但是当我运行 gsub 时,我得到一个空字符串:inputstr.gsub(myregex,"")
看起来 gsub 正在捕获所有内容,而不仅仅是 () 中的逗号。 我哪里出错了?
result = inputstr.gsub(/,(?=d{3}b)/, '')
仅当后面正好三位数字时,才删除逗号。
(?=...)
是一个前瞻断言:它需要在当前位置进行匹配,但它不会成为实际匹配(并随后替换)的文本的一部分。
您将"匹配"与"捕获"混淆了:"捕获"意味着保存某些内容,以便以后可以参考。您不想捕获逗号,而是捕获其他所有内容,然后使用捕获的部分来构建替换字符串。
尝试
myregex = /(d+),(d{3})/
inputstr.gsub(myregex,'12')
在您的示例中,可以从最后一个分隔符(,
或.
)之后的位数判断它是小数点,因为有 2 个孤数字。在大多数情况下,如果最后一组数字没有 3 位数字,那么您可以假设前面的分隔符是小数点。另一个迹象是大数字分隔符的多次出现使我们能够区分小数点和分隔符。
但是,我可以在没有任何上下文的情况下给出字符串123,456
或123.456
。无法分辨它们是"123,456"还是"123点456"。
您需要扫描文档以查找线索,
是用于千位分隔符还是小数点,反之亦然,用于.
。使用提供的上下文,您可以安全地应用相同的方法来删除千位分隔符。
您可能还想在维基百科上查看这篇文章,了解指定分隔符或小数点的不太常用的方法。知道并决定不支持比假设事情会奏效要好。