正则表达式将美元金额与大写字母或单词匹配

Regex to match dollar amount with uppercase letter or word

我正在尝试匹配某种金额,以下是所有可能性:

.6 million
,1 million
,1M
.3M
3,333
 million
 million

我已经有了这个正则表达式:

$\d{1,3}(?:,\d{3})*(?:\s+(?:thousand|[mb]illion|[MB]illion)|[M])?

online demo

但我无法匹配那些:

.6 million
,1 million
,1M
.3M

如有任何帮助,我们将不胜感激。

你可以使用

(?i)$\d+(?:[.,]\d+)*(?:\s+(?:thousand|[mb]illion)|m)?

如果您需要确保不匹配属于另一个单词的 m

(?i)$\d+(?:[.,]\d+)*(?:\s+(?:thousand|[mb]illion)|m)?\b

参见regex demo详情:

  • (?i) - 不区分大小写的选项
  • $ - 一个 $ 字符
  • \d+ - 一位或多位数字
  • (?:[.,]\d+)* - ., 的零次或多次重复,然后是一个或多个数字
  • (?:\s+(?:thousand|[mb]illion)|m)? - 可选的出现
    • \s+(?:thousand|[mb]illion) - 一个或多个空格,然后是 thousandmillionbillion
    • | - 或
    • m - 一个 m 字符
  • \b - 单词边界。

让我们看看您的正则表达式:

$\d{1,3}(?:,\d{3})*(?:\s+(?:thousand|[mb]illion|[MB]illion)|[M])?

$\d{1,3} 没问题。接下来是什么?回答这个问题的一种方法是考虑以下三种可能性。

要匹配的字符串结束' million'

此字符串(以 space 开头,以防您错过)前面是空字符串或单个数字,前面是逗号或句点:

(?:[,.]\d)? million

显然,"million"可以是"thousand"或"billion",倒数第一个可能是大写的,所以我们把表达式改成

(?:[,.]\d)? (?:[MmBb]illion|thousand)

一个潜在的问题是它匹配 '.6 millionaire'。我们可以通过添加一个单词边界来避免这个问题,以防止匹配后跟一个单词字符:

(?:[,.]\d)? (?:[MmBb]illion|thousand)\b

字符串结束'M'

在这种情况下,'M' 前面必须有单个数字,前面有逗号或句点:

[,.]\dM\b

您也可以接受 'B',方法是将 M 更改为 [MB]

字符串以逗号开头的三位数字结尾

这里需要

,\d{3}\b

这里单词边界避免匹配,例如3,3333'。但是,它不会匹配 '3,333,333''3,333,333,333'。如果我们想匹配那些我们可以将表达式更改为

(?:,\d{3})+\b

或者为了匹配 '3',将其更改为

(?:,\d{3})*\b

构造交替

因此我们可以使用下面的正则表达式。

$\d{1,3}(?:(?:[,.]\d)? (?:[MmBb]illion|thousand)\b|[,.]\dMb|,\d{3}b)

分解出我们获得的 end-of-string 锚点

$\d{1,3}(?:(?:[,.]\d)? (?:[MmBb]illion|thousand)|[,.]\dM|,\d{3})b

Demo