代码之家  ›  专栏  ›  技术社区  ›  Patrick Mccarthy

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

  •  2
  • Patrick Mccarthy  · 技术社区  · 7 年前

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

    (1a.) 也可以从以下内容开始: , $,

    1b。 货币值必须以一到三位数字开头

    逗号前:必须有一到三个数字

    2b。 逗号后:必须有三位数字

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

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

    [3b] 万亿/万亿/万亿,十亿/十亿/十亿,百万/百万。

    (3c.) 可选结束语:

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

    $1 dollar ✘
    1 ✘
    $1 ✓
    1 dollar ✓
    

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

    $1 trillion ✓
    1 trillion dollars ✓
    $1 ✓
    

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

    $1 ✓
    $1,000,000,000,000 ✓
    

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

    $1 ✓
    $1.000 ✓
    

    $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 ✓
    

    以下是我目前掌握的信息:

    [£€$]?[0-9]+[,.]?[0-9][pcm][ euros| euro]*
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   robinCTS    7 年前

    下面的正则表达式不依赖于独立行上的值,但也将从一个句子中获取它们。

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

    此外,它允许文字和数字之间有无限的空白,而且 数字和以下值字或单位之间的空白。

    说明:

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

    (@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组是整体比赛的一部分。

    前缀后缀选择器 是执行以下操作的条件语句:

    • If组1( Prefix )匹配,然后添加组2( Value )如果没有第三组的话,那么就整体比赛而言( Postfix )遵循它。

    • 如果没有 前缀 匹配,然后将整体匹配设置为 价值 然后 后缀 之前的 价值 .

    \b 让我们确保整个单词都匹配。同样,负面展望 (?![\d.,])

    @前缀@:

    [£€$]
    

    @值@:

    \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
    

    @后缀@:

    \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)\2(?!\3)|(?<![£€$])\2\3)
    

    Demo


    注意事项:

    • 句子中出现的值(如“$1”)后跟逗号或句号将不匹配。(例如,仅 $2 在句子中匹配 This sentence is worth $1, $2 or $3. .)

    • 由带逗号和/或小数点的数字组成的值 允许有值字,例如“10000000000”。

        2
  •  0
  •   PJProudhon devMoki    7 年前

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

    Demo