regex 匹配全局货币值的正则表达式

kcrjzv8t  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(122)

我需要一个匹配以下所有格式的正则表达式:

$ 1.234,56
R$ 1.234,56
1.234,56 $
1.234,56 Kč
kr. 1.234,56
€1.234,56
HK$ 1,234.56
1.234,56 Ft
₹ 1,234.56
₪ 1.234,56
¥ 1,234.56
₩ 1,234.56
RM 1,234.56
$ 1,234.56
kr 1,234.56
₱ 1,234.56
1.234,56 zł
1.234,56 p.
$1,234.56
R 1,234.56
1.234,56 kr
fr. 1.234,56
元 1,234.56
1,234.56 ฿
1,234.56 ₺
£1,234.56
$1,234.56
1.234,56 ₫
$0
$0.00
$ 0,00
$ 0.00
0.00
0,00
1234.00
1234,00
(1,234.00)
$(1,234.00)
($1,234.00)
-$1,234.00
-1234.00
$-1,234.00
234.00 CR
234.00 DR
234.00 WD
234.00 W/D

CR和DR应该可以是大写、混合和小写,如下所示:CR、Cr、cR、cr
WD和W/D应该只能是大写和小写,就像这样:WD,wd,W/D,w/d
它必须排除不符合货币格式的独立数字(即4、45、456、4567等)。如果一个数字不包含货币符号,无论是之前还是之后(参考我提供的格式),它必须包含正确的货币格式,通过十进制和/或逗号分隔(即234.00、234,00、1234.00 1234,00等)。
此外,只要符合正确的格式,任何美元金额都必须能够使用。我提供的例子只是例子。
我已经很接近了,但似乎不能得到它的权利。
以下是我目前掌握的信息:

^(?:[$€£₹¥฿₽₺₴₸₣₱₩₮₡₢₣₲₳₵₪₺﷼]|(?:[A-Z]{2,3}\\s?\\.?\\s?))?\\s?\\d{1,3}(?:[.,]\\d{3})*(?:[.,]\\d{2})?\\s?(?:[$€£₹¥฿₽₺₴₸₣₱₩₮₡₢₣₲₳₵₪₺﷼]|(?:[A-Z]{2,3}\\s?\\.?\\s?))?$

这被用于查找来自世界各地的银行对账单上的交易中的货币金额。
首先感谢所有的正则表达式Maven!

6qqygrtg

6qqygrtg1#

RegEx101

需要大量的嵌套组((...))和交替|才能满足标准并匹配OP列表中的特定字符串。

/^(([$-]){1,2}|([$€£]\s?)|([₹₪¥₩₱R元]|R\$|kr\.?|HK\$|RM?|fr\.)\s) 
((\d{1,3}(,\d{3})*(\.\d{2})?)|(\d{1,3}(\.\d{3})*(,\d{2})?))$
|
^(-?(\d{1,3}(,\d{3})*(\.\d{2})?)|(\d{1,3}(\.\d{3})*(,\d{2})?))
\s(Kč|Ft|zł|p\.|kr|[Cc][Rr]|[Dd][Rr]|W\/?D|w\/?d|[$฿₺₫])$
|
^(([$-]){1,2}\(|\(([$-]){1,2}|\$\(-|-\(\$|\()
(\d{1,3}(,\d{3})*(\.\d{2})?)\)$
|
^-?\d{1,4}([,.]\d{3})*[,.]\d{2}$
|
^(\$\s|-\$|\$-)\d{1,3}$
/gm

示例

const regexp = /^(([$-]){1,2}|([$€£]\s?)|([₹₪¥₩₱R元]|R\$|kr\.?|HK\$|RM?|fr\.)\s)((\d{1,3}(,\d{3})*(\.\d{2})?)|(\d{1,3}(\.\d{3})*(,\d{2})?))$|^(-?(\d{1,3}(,\d{3})*(\.\d{2})?)|(\d{1,3}(\.\d{3})*(,\d{2})?))\s(Kč|Ft|zł|p\.|kr|[Cc][Rr]|[Dd][Rr]|W\/?D|w\/?d|[$฿₺₫])$|^(([$-]){1,2}\(|\(([$-]){1,2}|\$\(-|-\(\$|\()(\d{1,3}(,\d{3})*(\.\d{2})?)\)$|^-?\d{1,4}([,.]\d{3})*[,.]\d{2}$|^(\$\s|-\$|\$-)\d{1,3}$/gm;

const string = `$1,234.56
£1,234.56
$1.234,56
€1.234,56
$ 1,234.56
$ 1.234,56
R 1,234.56
₹ 1,234.56
₹ 1,234.56
₹ 1,234.56
¥ 1,234.56
₩ 1,234.56
元 1,234.56
R$ 1.234,56
RM 1,234.56
kr 1,234.56
kr. 1.234,56
fr. 1.234,56
HK$ 1,234.56
1.234,56 $
1,234.56 ฿
1,234.56 ₺
1.234,56 ₫
1.234,56 Ft
1.234,56 kr
1.234,56 p.
1.234,56 Kč
1.234,56 zł
$0
$0.00
$ 0,00
$ 0.00
0.00
0,00
$12,345,678.90
$12.345.678,90
1,234,567,890.00 $
12.34
12,34
1,234.56
12.345.67
12,345,67
1,234 $
1,234.45 $
1.234 $
1.234,45 $
$123
$1.234
$1,234
1234.56
1234,56
(1,234.56)
$(1,234.56)
($1,234.56)
-$1,234.56
-1234.56
$-1,234.56
123.45 CR
123.45 DR
123.45 WD
123.45 W/D
The proceeding lines do not match
1
123.456
123,456
123.0
$12.3
.12
$12,3
$1223456
$.123
$1,0000
$1234
`;

const matches = string.match(regexp);

console.log(`${matches.length} matches in 73 lines.`);
console.log(JSON.stringify(matches));
console.log(`The last match is: ${matches[matches.length-1]}`);

| ####子模式|####说明|
| - -----|- -----|
|

/

|正则表达式的开始|
|

^(([$-]){1,2}|([$€£]\s?)|([₹₪¥₩₱R元]|R$|kr.?|HK$|RM?|fr.)\s)

|行首-匹配1或2个文字$和/或-文字$£后跟0或1个空格文字¥R,或后跟空格文字kr和0或1 .后跟空格文字HK$后跟空格文字fr.后跟空格...|
|

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

|... then match 1 to 3 digits followed by 0 or more groups of a literal , and 3 digits followed by 0 or 1 group of a literal . and 2 digitsormatch 1 to 3 digits followed by 0 or more groups of a literal . and 3 digits followed by 0 or 1 group of a literal , and 2 digits - end of line|
|

|

||
|

^(-?(\d{1,3}(,\d{3})*(.\d{2})?)|(\d{1,3}(.\d{3})*(,\d{2})?))

|行首-匹配0或1文字-,然后引用第2行第2个单元格...|
|

\s(Kč|Ft|zł|p.|kr|[Cc][Rr]|[Dd][Rr]|W/?D|w/?d|[$฿₺₫])$

|……然后匹配1个空格,后跟文字Ftp.krC/cR/rD/dR/rW,后跟0个或更多个/和1个Dw后跟0或更多/和1 d文字$฿-行尾|
|

|

||
|

^(([$-]){1,2}(|(([$-]){1,2}|$(-|-($|()

|行开始-匹配1或2个文字$和/或-,后跟文字(文字(,后跟文字$和/或-文字$(-文字$(-文字(...|
|

(\d{1,3}(,\d{3})*(.\d{2})?))$

|...然后匹配1到3位数字,后跟0组或更多组文字,,3位数字后跟0或1组文字.,2位数字后跟文字)-行结束|
|

|

||
|

^-?\d{1,4}([,.]\d{3})*[,.]\d{2}$

|行首-匹配0或1个文字-,后跟1到4位数字,后跟0组或多组文字.,和3位数字,后跟文字.,和2位数字-行尾|
|

|

||
|

^($\s|-$|$-)\d{1,3}$

|行首-匹配文字$和1个空格文字-$文字$-,后跟1到3位数字-行尾|
|

/gm

|正则表达式结束-g全局标志:在第一个match /m ultiline标志之后继续查找匹配项:^ =行的开始$ =行的结束|

qkf9rpyu

qkf9rpyu2#

# Subpattern definitions
(?(DEFINE)
  (?<number>                         # Match a nicely formatted number
    (?=\d+[.,]|0\D)                  # that has at least one dot or comma, or is '0',
    \d{1,3}                          # starts with 1 to 3 digits,
    (?=(?<separator>[.,]))?          # an optional separator which we capture,
    (?:\k<separator>\d{3})*          # then 0+ 3-digit groups separated by it
    (?:(?!\k<separator>)[.,]\d{2})?  # and ends with optional decimal places.
  )

  (?<currency>
    # Unicode property for currency signs
    \p{Sc}
  |
    # Single-char symbols not included in the property above
    [元圆圓] # etc.
  |
    # Multiple-char currencies need to be input manually
    (?:HK|R)?\$|[kf]r(?:\s*\.)?|RM?|Ft|zł|Kč|p\.

    # Use \p{L}{1,3}(?:\s*\.)? when in despair
  )
)

# Real matching pattern
^                                    # Match at the start of string
(?:                                  # either
  \g<currency>\s*\g<number>          # a currency-number pair
|                                    # or
  \g<number>(?:\s*\g<currency>)?     # a number-currency pair or a number
)                                    # right before
$                                    # the end of string.

试试on regex101.com

相关问题