【问题标题】:Hints for a complex currency regular expression for Javascript?Javascript 的复杂货币正则表达式的提示?
【发布时间】:2009-06-17 15:13:52
【问题描述】:

我需要在网页中匹配无限数量的图形。

我需要能够匹配以下所有格式:

100 $
99$
$99
$ 8
$.99
$ .8
$ 99.8
.99$
.99 $
9.2 $
1.2$

以及使用逗号的等价物:

444,333
22,333
1,222
11,111,111
333,333,333,333.01132

或空格:

444 333
22 333
1 222
11 111 111
333 333 333 333.01132

这对我来说真的很难。我习惯于使用正则表达式,但我完全没能写出一些防弹的东西。通常http://www.regexlib.com 有解决方案,但不是这个。

我想不出除了使用正则表达式之外的其他方法,因为它是纯文本搜索/替换。

【问题讨论】:

    标签: javascript regex currency


    【解决方案1】:

    这是一个匹配您提供的所有数字格式的正则表达式:

    ^(?:\$\s*)?(?:(?:\d{0,3}(?:[, ]\d{0,3})*[, ])+\d{3}|\d+)(?:\.\d*)?(?:\s*\$)?$
    

    分解:

    • ^(?:\$\s*)? 将在字符串的开头查找可选的 $,后跟任意数量的空格
    • (?:(?:\d{0,3}(?:[, ]\d{0,3])*[, ])+\d{3}|\d*) 将匹配一个以逗号或空格分隔的数字 (\d{0,3}(?:[, ]\d{0,3})*[, ])+\d{3}) 或一串数字 (\d+) - 因此 123,456,789、123 456 789 和 123456789 将全部匹配。正则表达式不会接受分组不当的数字(因此 123,45,6789 将不会匹配)
    • (?:\.\d*)? 将匹配一个带有可选小数的数字以及后面的任意数字
    • (?:\s*\$)?$ 将匹配字符串末尾的可选 $,前面有任意数量的空格。

    【讨论】:

    • 是的,但它也会匹配空字符串,以及不带美元符号的任意位数。
    • @Nikolai 哎呀,应该是 \d+,而不是 \d*,我会解决这个问题。而且我从需求中也没有看到需要美元符号?
    • 不,要求不明确。但如果只是匹配所有示例,.* 就可以了。
    【解决方案2】:

    既然可以写几个,为什么要写1个,然后依次应用?

    我假设 (?) 您可以逐行迭代。为什么不试试你的逗号正则表达式,然后是你的空格正则表达式等?如果一个匹配,那么不要费心尝试其余的,并存储你的结果并继续下一行。

    【讨论】:

    • 这肯定比任何单个正则表达式都更具可读性。 +1/
    • +1 但并不方便,因为在 JS 中解析 textnode 已经需要数千个函数调用 lambda,有数百个闭包......
    【解决方案3】:

    如何分两步完成:

    首先用''替换所有空格

    那么,如果数字格式始终相同,您可以将逗号替换为 ''

    之后,就很容易了,不是吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-30
      • 2017-12-29
      相关资源
      最近更新 更多