正则表达式匹配取决于lookbehind匹配

时间:2017-03-30 09:40:47

标签: regex

我需要匹配这些值:

(正则表达式的第一种方法,粗略地做我想要的)

\d+([.,]\d{3})*[.,]\d{2}

喜欢

24,56
24.56
1.234,56
1,234.56
1234,56
1234.56

但我需要匹配

1.234.56
1,234,56

所以我需要检查最后一次出现的“.”或“,”是否与之前的“.”或“,不一样”

背景:金额应以英文和德文格式与(可选)1000分隔符匹配。

但即使在regex101的帮助下,我也完全没有找到正确工作的后视镜。任何建议都非常感谢。

更新

根据我到目前为止的答案,我想出了这个(demo):

\d{1,3}(?:([\.,'])?\d{3})*(?!\1)[\.,\s]\d{2}

但它匹配例如1234.567,23,这是不可取的。

2 个答案:

答案 0 :(得分:2)

您可以捕获数字分组符号并使用带有反向引用的负前瞻来限制小数分隔符:

^(?:\d+|\d{1,3}(?:([.,])\d{3})*)(?!\1)[.,]\d{2}$
                  ^    ^        ^^^^^

请参阅regex demo

第1组将包含数字分组符号的最后一个值,(?!\1)[.,]将与另一个符号匹配。

<强>详情:

  • ^ - 字符串开头
  • (?:\d+|\d{1,3}(?:([.,])\d{3})*) - 两种选择中的任何一种:
    • \d+ - 1+位数
    • | - 或
    • \d{1,3} - 1到3位,
    • (?:([.,])\d{3})* - 零个或多个序列:
      • ([.,]) - 第1组捕获.,
      • \d{3} - 3位数
  • (?!\1)[.,] - .,但不等于上次使用([.,])模式捕获的内容
  • \d{2} - 2位数
  • $ - 字符串结束。

答案 1 :(得分:2)

您可以使用

^\d+(([.,])\d{3})*(?!\2)[.,]\d{2}$

live demo