正则表达式将美元金额与大写字母或单词匹配
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])?
但我无法匹配那些:
.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)
- 一个或多个空格,然后是 thousand
、million
或 billion
|
- 或
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
我正在尝试匹配某种金额,以下是所有可能性:
.6 million
,1 million
,1M
.3M
3,333
million
million
我已经有了这个正则表达式:
$\d{1,3}(?:,\d{3})*(?:\s+(?:thousand|[mb]illion|[MB]illion)|[M])?
但我无法匹配那些:
.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)
- 一个或多个空格,然后是thousand
、million
或billion
|
- 或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