RegEx价格?

时间:2009-10-10 10:21:26

标签: regex

我正在寻找价格的RegEx。 因此它应该是前面的X数字,而不是“,”,最后是2个数字。

有人可以支持我并发布吗?

12 个答案:

答案 0 :(得分:17)

你打算用什么语言?

应该是这样的:

^\d+(,\d{1,2})?$

阐释:

前面的X号是:^\d+其中^表示字符串的开头,\d表示数字,+表示一个数字或更多

我们使用带有问号的组()?表示:匹配组内的内容一次或不一次。

在群组内部有,\d{1,2},是您写的逗号,\d仍然是数字{1,2}表示匹配前一个数字一两次。

最终$匹配字符串的结尾。

答案 1 :(得分:11)

我对以前的答案不满意。以下是我的看法:

\d{1,3}(?:[.,]\d{3})*(?:[.,]\d{2})

|^^^^^^|^^^^^^^^^^^^^|^^^^^^^^^^^|
| 1-3  | 3 digits    | 2 digits  |
|digits| repeat any  |           |
|      | no. of      |           |
|      | times       |           |

(详情请见https://regex101.com/r/cG6iO8/1

涵盖以下所有案例

  • 5.00
  • 1000
  • 1,000,000.99
  • 5,99(欧洲价格)
  • 5.999,99(欧洲价格)
  • 0.11
  • 0.00

但也有奇怪的东西,比如

  • 5.000,000.00

如果你想要包括5和1000(我个人伤害不喜欢匹配所有数字),那么只需添加一个“?”像这样:

\d{1,3}(?:[.,]\d{3})*(?:[.,]\d{2})?

答案 2 :(得分:4)

所以我遇到了类似的问题,需要验证任意字符串是否是一个价格,但需要比此线程和许多其他线程中提供的正则表达式更多的弹性。

我需要一个符合以下所有条件的正则表达式:

  • 5
  • 5.00
  • 1000
  • 1,000,000.99
  • 5,99(欧洲价格)
  • 5.999,99(欧洲价格)
  • 0.11
  • 0.00

不要匹配IP地址等内容。我无法弄清楚单一的正则表达式一下子处理欧洲和非欧洲的东西,所以我写了一些Ruby代码来规范化价格:

if value =~ /^([1-9][0-9]{,2}(,[0-9]{3})*|[0-9]+)(\.[0-9]{1,9})?$/
  Float(value.delete(","))
elsif value =~ /^([1-9][0-9]{,2}(\.[0-9]{3})*|[0-9]+)(,[0-9]{1,9})?$/
  Float(value.delete(".").gsub(",", "."))
else
  false
end

两个正则表达式之间的唯一区别是交换的小数位和逗号。我会尝试分解这是做什么的:

/^([1-9][0-9]{,2}(,[0-9]{3})*|[0-9]+)(\.[0-9]{1,9})?$/

第一部分:

([1-9][0-9]{,2}(,[0-9]{3})*

这是遵循此形式的数字声明:1,000 1,000,000 100 12.但它不允许前导零。它适用于格式正确的数字,其中包含由数千个分隔符分隔的3个数字组。

第二部分:

[0-9]+

只需匹配任意数字1次或更多次。如果你想匹配,你可以做0次或更多次:.11 .34 .00等。

最后一部分:

(\.[0-9]{1,9})?

这是小数位。你问为什么多达9个数字?我已经看到它发生了。这个正则表达式应该能够处理它看到的任何奇怪和美妙的价格,我看到一些零售商在价格中使用多达9位小数。通常都是0,但我们不想错过数据^ _ ^

希望这有助于下一个人需要处理任意格式错误的价格字符串或欧洲或非欧洲格式:)

答案 3 :(得分:3)

^\d+,\d{1,2}$

答案 4 :(得分:1)

我目前正在开发一个使用正则表达式的小函数来获取字符串中的价格数量:

private static String getPrice(String input)
{
    String output = "";

    Pattern pattern = Pattern.compile("\\d{1,3}[,\\.]?(\\d{1,2})?");
    Matcher matcher = pattern.matcher(input);
    if (matcher.find())
    {
        output = matcher.group(0);
    }

    return output;
}

这似乎适用于小价格(0,00至999,99)和各种货币:

$ 12.34 - > 12.34

$ 12,34 - > 12,34

$ 12.00 - > 12.00

$ 12 - > 12

12€ - > 12

12,11€ - > 12,11

12.999€ - > 12.99

12.9€ - > 12.9

£999.99€ - > 999.99

...

答案 5 :(得分:0)

\ d +((\ d +)+)?(\ d +)?(\ d +)?(\ d +)?

涵盖所有

  • 5

    5.00

    1000

    1,000,000.99

    5,99(欧洲价格)

    5.999,99(欧洲价格)

    0.11

    0.00

答案 6 :(得分:0)

^ [0-9] +。?[0-9] {2}?$

这是一个允许:

0,12,12.01等

并且不允许使用12.,12.1,19.0.0等

答案 7 :(得分:0)

这段代码对我有用!! (PHP)

preg_match_all('/\d+((,\d+)+)?(.\d+)?(.\d+)?(,\d+)?/',$price[1]->plaintext,$lPrices);

答案 8 :(得分:0)

到目前为止,我尝试过,这是最好的

\d{1,3}[,\\.]?(\\d{1,2})?

https://regex101.com/r/xT8aQ7/1

答案 9 :(得分:0)

如果你可能有或没有小数部分,但是数量显示为100,000或100,000.00,这个合理地起作用。仅使用Clojure进行测试

\ d {1,3}(?:[。,] \ d {3})*(:[。,] \ d {2,3})

答案 10 :(得分:0)

对于“,”分隔的数字(或没有分隔的数字)具有2个小数位非常简单,支持分隔符但不强制使用它们。需要改进,但应该可以。

^((\d{1,3}|\s*){1})((\,\d{3}|\d)*)(\s*|\.(\d{2}))$

matches:
    1,123,456,789,134.45
    1123456134.45
    1234568979
    12,345.45
    123.45
    123
no match:
    1,2,3
    12.4
    1234,456.45

这可能需要一些编辑才能使其正常运行

快速说明:匹配1-3个数字(或不匹配任何字符),匹配一个逗号,后跟3个需要的次数(或仅匹配数字),匹配一个小数点后跟1个或2个数字(或不匹配)

答案 11 :(得分:-4)

类似\ d +,\ d {2}的错误是因为\ d匹配[0-9 \。],即12.34,1。

应该是:[0-9] +,[0-9] {2}(或[0-9] +,[0-9] {1,2}只允许1位小数)