首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >英镑/美元/欧元的货币正则表达式

英镑/美元/欧元的货币正则表达式
EN

Stack Overflow用户
提问于 2017-11-14 11:48:18
回答 2查看 1.8K关注 0票数 2

需要一些帮助来创建满足以下规则的正则表达式。如有任何建议,将不胜感激。

(1a.)可选择地以:£、$、欧元开头

1b.货币价值必须以1至3位数字开头。

2a.逗号前的:必须有1到3位数字

2b.逗号后面的:必须有三个数字

2c.小数点之后:只能有数字

3a.货币值必须以一个或多个数字结尾。

3b.值依次为:Tn/Tn/万亿/万亿、万亿/10亿/万亿、百万/百万/万亿。

(3c.)可选择以:P/P/pence/便士、c/C/美分/美分、欧元/欧元/euro(S)、美元/美元、英镑/英镑结束。

规则1a和3c是相互排斥的,但是必须使用其中之一:

代码语言:javascript
复制
$1 dollar ✘
1 ✘
$1 ✓
1 dollar ✓

规则3b可与规则1a或3c一起使用,但不需要使用:

代码语言:javascript
复制
$1 trillion ✓
1 trillion dollars ✓
$1 ✓

规则2a/2b可用于零或多次:

代码语言:javascript
复制
$1 ✓
$1,000,000,000,000 ✓

规则2c只能使用一次或零次:

代码语言:javascript
复制
$1 ✓
$1.000 ✓

预期结果:

代码语言:javascript
复制
$1 dollar ✘
1 ✘
$1,00000.000,000 ✘
1,000.00 ✘

$1 ✓
1 dollar ✓
$1 trillion ✓
1 trillion dollars ✓
$1,000,000,000,000 ✓
$1.000 ✓
$1,000,000,000,000.000000 ✓

到目前为止,我的情况如下:

代码语言:javascript
复制
[£€$]?[0-9]+[,.]?[0-9][pcm][ euros| euro]*
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-14 16:45:59

下面的regex不依赖于分隔行上的值,但也会从一个句子中获取它们。

它还假定单位“美分”、“美元”和“英镑”可以是单数。

此外,它还允许单词和数字之间无限制的空白,并且在数字和下面的值字或单位之间也不允许空白。

解释:

下面是正则表达式的基本结构,其子表达式由两个@s包围的值表示:

代码语言:javascript
复制
(@Prefix@)?(?=(@Value@)(\s*@Postfix@)?)(?(1)\2(?!\3)|(?<!@Prefix@)\2\3)
|________|    |_______||____________|  |______________________________|
    |             |           |                       |
 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当且仅当在Value之前没有Prefix

这些子表达式是相当清楚的。\b确保整个单词是匹配的。同样,数字后面的负前瞻(?![\d.,])确保没有留下数字、逗号和小数点。

@前缀@:

代码语言:javascript
复制
[£€$]

@Value:

代码语言:javascript
复制
\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:

代码语言:javascript
复制
\s*(?:[pP](?:ence)?|[cC](?:ents?)?|€|[eE]uros?|[dD]ollars?|[pP]ounds?)\b

解决方案:

用子表达式替换占位符将导致这个完整的正则表达式:

代码语言:javascript
复制
([£€$])?(?=(\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)\2(?!\3)|(?<![£€$])\2\3)

演示

警告:

  • 一个像"$1“这样的值出现在一个句子中,后面跟着逗号或句号,将不会匹配。(例如,在句子$2中只有This sentence is worth $1, $2 or $3.匹配。)
  • 一个由带有逗号和/或小数点的数字组成的值,允许一个值字,例如“100万”。
票数 1
EN

Stack Overflow用户

发布于 2017-11-14 12:46:13

要进行互斥管理,可以使用“货币符号分组”和“普通货币名称测试组”:

代码语言:javascript
复制
^([$£€])?\d{1,3}(?:,\d{3})*(?:\.\d+)?\s?(?:(?:[BMbm]|[Tt]r)(?:illion)?)?(?(1)|\s(?:(?:[Dd]ollar|[Pp]ound|[Ee]uro|[Cc]ent)s?|€|[Pp]ence))$

演示

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47285060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档