GBP/USD/EUR 的货币正则表达式
Currency regular expression for GBP/USD/EUR
需要一些帮助来创建满足以下规则的正则表达式。任何建议将不胜感激。
(1a.) 可选地开始于:
£, $, €
1b.货币值必须以一到三位数字开头
2a. 逗号前:必须有一到三位数
2b.逗号后:必须是三位数字
2c。小数点后:只能有数字
3a.货币值必须以一位或多位数字结尾
[3b.] 值后可能跟有:
tn/Tn/Trillion/trillion, bn/Bn/Billion/billion, m/Million/million.
(3c.) 可选择以以下结尾:
p/P/Pence/pence, c/C/Cents/cents, €/欧元/欧元, Dollars/dollars, Pounds/pounds.
规则 1a 和 3c 互斥,但必须使用其中之一:
dollar ✘
1 ✘
✓
1 dollar ✓
规则 3b 可以与规则 1a 或 3c 一起使用,但不需要使用:
trillion ✓
1 trillion dollars ✓
✓
规则 2a/2b 可以使用零次或多次:
✓
,000,000,000,000 ✓
规则 2c 只能使用一次或零次:
✓
.000 ✓
预期结果:
dollar ✘
1 ✘
,00000.000,000 ✘
1,000.00 ✘
✓
1 dollar ✓
trillion ✓
1 trillion dollars ✓
,000,000,000,000 ✓
.000 ✓
,000,000,000,000.000000 ✓
这是我目前的情况:
[£€$]?[0-9]+[,.]?[0-9][pcm][ euros| euro]*
要进行互斥管理,您可以对货币符号使用分组,对普通货币名称使用测试组:
^([$£€])?\d{1,3}(?:,\d{3})*(?:\.\d+)?\s?(?:(?:[BMbm]|[Tt]r)(?:illion)?)?(?(1)|\s(?:(?:[Dd]ollar|[Pp]ound|[Ee]uro|[Cc]ent)s?|€|[Pp]ence))$
以下正则表达式不依赖于单独行上的值,但也会从句子中获取它们。
它还假定单位 "cents"、"dollars" 和 "pounds" 可以是单数。
此外,它允许单词和数字之间有无限的空格,并且没有数字和后面的值单词或单位之间的空格。
解释:
以下是正则表达式的基本结构,子表达式由两个 @
包围的值表示:
(@Prefix@)?(?=(@Value@)(\s*@Postfix@)?)(?(1)(?!)|(?<!@Prefix@))
|________| |_______||____________| |______________________________|
| | | |
Group 1 Group 2 Group 3 Prefix-Postfix Selector
第 1 组可选择匹配前缀。
第 2 组和第 3 组在前瞻中捕获,因此当执行 Prefix-Postfix Selector
时,只有第 1 组是整体匹配的一部分。
Prefix-Postfix Selector
是执行以下操作的条件语句:
如果第 1 组 (Prefix
) 匹配,则将第 2 组 (Value
) 添加到整体匹配中,前提是没有第 3 组 (Postfix
) 紧随其后。
如果没有 Prefix
匹配,则将整体匹配设置为 Value
后跟 Postfix
当且仅当 Prefix
前面没有 Value
.
子表达式相当不言自明。 \b
确保匹配整个单词。同样,数字后的否定前瞻 (?![\d.,])
确保没有数字、逗号和小数点被遗忘。
@Prefix@:
[£€$]
@Value@:
\d{1,3}(?:,\d{3})*(?:\.\d+)?(?![\d.,])(?:\s*(?:[tTbB]n|m|(?:[tT]r|[bBmM])illion)\b)?
|_____||_________||________|| || |
|__________________________||________||____________________________________________|
| | |
Number, e.g. 12,345.6 | [[Whitespace] + Value Word, e.g. Tn or Billion]
|
Makes sure "1000" is not matched, for example
@Postfix@:
\s*(?:[pP](?:ence)?|[cC](?:ents?)?|€|[eE]uros?|[dD]ollars?|[pP]ounds?)\b
解法:
用子表达式替换占位符导致这个完整的正则表达式:
([£€$])?(?=(\d{1,3}(?:,\d{3})*(?:\.\d+)?(?![\d.,])(?:\s*(?:[tTbB]n|m|(?:[tT]r|[bBmM])illion)\b)?)(\s*(?:[pP](?:ence)?|[cC](?:ents?)?|€|[eE]uros?|[dD]ollars?|[pP]ounds?)\b)?)(?(1)(?!)|(?<![£€$]))
注意事项:
不会匹配出现在句子中后跟逗号或句号的值,如“$1”。 (例如This sentence is worth , or .
这句只匹配到
。)
由逗号组成的数值and/or一个小数点和一个数值字是允许的,例如"1,000,000 百万".
需要一些帮助来创建满足以下规则的正则表达式。任何建议将不胜感激。
(1a.) 可选地开始于: £, $, €
1b.货币值必须以一到三位数字开头
2a. 逗号前:必须有一到三位数
2b.逗号后:必须是三位数字
2c。小数点后:只能有数字
3a.货币值必须以一位或多位数字结尾
[3b.] 值后可能跟有: tn/Tn/Trillion/trillion, bn/Bn/Billion/billion, m/Million/million.
(3c.) 可选择以以下结尾: p/P/Pence/pence, c/C/Cents/cents, €/欧元/欧元, Dollars/dollars, Pounds/pounds.
规则 1a 和 3c 互斥,但必须使用其中之一:
dollar ✘
1 ✘
✓
1 dollar ✓
规则 3b 可以与规则 1a 或 3c 一起使用,但不需要使用:
trillion ✓
1 trillion dollars ✓
✓
规则 2a/2b 可以使用零次或多次:
✓
,000,000,000,000 ✓
规则 2c 只能使用一次或零次:
✓
.000 ✓
预期结果:
dollar ✘
1 ✘
,00000.000,000 ✘
1,000.00 ✘
✓
1 dollar ✓
trillion ✓
1 trillion dollars ✓
,000,000,000,000 ✓
.000 ✓
,000,000,000,000.000000 ✓
这是我目前的情况:
[£€$]?[0-9]+[,.]?[0-9][pcm][ euros| euro]*
要进行互斥管理,您可以对货币符号使用分组,对普通货币名称使用测试组:
^([$£€])?\d{1,3}(?:,\d{3})*(?:\.\d+)?\s?(?:(?:[BMbm]|[Tt]r)(?:illion)?)?(?(1)|\s(?:(?:[Dd]ollar|[Pp]ound|[Ee]uro|[Cc]ent)s?|€|[Pp]ence))$
以下正则表达式不依赖于单独行上的值,但也会从句子中获取它们。
它还假定单位 "cents"、"dollars" 和 "pounds" 可以是单数。
此外,它允许单词和数字之间有无限的空格,并且没有数字和后面的值单词或单位之间的空格。
解释:
以下是正则表达式的基本结构,子表达式由两个 @
包围的值表示:
(@Prefix@)?(?=(@Value@)(\s*@Postfix@)?)(?(1)(?!)|(?<!@Prefix@))
|________| |_______||____________| |______________________________|
| | | |
Group 1 Group 2 Group 3 Prefix-Postfix Selector
第 1 组可选择匹配前缀。
第 2 组和第 3 组在前瞻中捕获,因此当执行 Prefix-Postfix Selector
时,只有第 1 组是整体匹配的一部分。
Prefix-Postfix Selector
是执行以下操作的条件语句:
如果第 1 组 (
Prefix
) 匹配,则将第 2 组 (Value
) 添加到整体匹配中,前提是没有第 3 组 (Postfix
) 紧随其后。如果没有
Prefix
匹配,则将整体匹配设置为Value
后跟Postfix
当且仅当Prefix
前面没有Value
.
子表达式相当不言自明。 \b
确保匹配整个单词。同样,数字后的否定前瞻 (?![\d.,])
确保没有数字、逗号和小数点被遗忘。
@Prefix@:
[£€$]
@Value@:
\d{1,3}(?:,\d{3})*(?:\.\d+)?(?![\d.,])(?:\s*(?:[tTbB]n|m|(?:[tT]r|[bBmM])illion)\b)?
|_____||_________||________|| || |
|__________________________||________||____________________________________________|
| | |
Number, e.g. 12,345.6 | [[Whitespace] + Value Word, e.g. Tn or Billion]
|
Makes sure "1000" is not matched, for example
@Postfix@:
\s*(?:[pP](?:ence)?|[cC](?:ents?)?|€|[eE]uros?|[dD]ollars?|[pP]ounds?)\b
解法:
用子表达式替换占位符导致这个完整的正则表达式:
([£€$])?(?=(\d{1,3}(?:,\d{3})*(?:\.\d+)?(?![\d.,])(?:\s*(?:[tTbB]n|m|(?:[tT]r|[bBmM])illion)\b)?)(\s*(?:[pP](?:ence)?|[cC](?:ents?)?|€|[eE]uros?|[dD]ollars?|[pP]ounds?)\b)?)(?(1)(?!)|(?<![£€$]))
注意事项:
不会匹配出现在句子中后跟逗号或句号的值,如“$1”。 (例如
This sentence is worth , or .
这句只匹配到。)
由逗号组成的数值and/or一个小数点和一个数值字是允许的,例如"1,000,000 百万".