Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Javascript中构建匹配1234.56 1.234,56 1234.56和1234,56的正则表达式?_Javascript_Regex - Fatal编程技术网

如何在Javascript中构建匹配1234.56 1.234,56 1234.56和1234,56的正则表达式?

如何在Javascript中构建匹配1234.56 1.234,56 1234.56和1234,56的正则表达式?,javascript,regex,Javascript,Regex,我正在尝试构建一个正则表达式,将带有“,”和“.”的数字分别作为千和小数的分隔符进行匹配,反之亦然 1234.56 1.234,56 1234.56 1234,56 此正则表达式: /^(\d{1,3}(?:([,\.])\d{3}{1}(?:\2\d{3})*\d+(:(?!\2)[,\.])(\d*)$/ 匹配1和2,但不匹配3和4 我试图做的是捕获数千分隔符,并防止它被用作十进制分隔符。因此,如果千的分隔符是“”,那么十进制分隔符必须是“”,如果千的分隔符是“”,那么十进制分隔符必须是“

我正在尝试构建一个正则表达式,将带有“,”和“.”的数字分别作为千和小数的分隔符进行匹配,反之亦然

  • 1234.56
  • 1.234,56
  • 1234.56
  • 1234,56
  • 此正则表达式:

    /^(\d{1,3}(?:([,\.])\d{3}{1}(?:\2\d{3})*\d+(:(?!\2)[,\.])(\d*)$/
    
    匹配1和2,但不匹配3和4

    我试图做的是捕获数千分隔符,并防止它被用作十进制分隔符。因此,如果千的分隔符是“”,那么十进制分隔符必须是“”,如果千的分隔符是“”,那么十进制分隔符必须是“”。但我无法匹配没有千分隔符的数字。我认为这是因为数千分隔符catch组为空

    如何构造正则表达式以匹配这四种情况?

    这是怎么回事

    (?:(?:,?(?:\d){1,3})+\.(?:\d\d)\b);(?:(?:\.?(?:\d){1,3})+\,(?:\d\d)\b)

    现实中有两种模式。当彗差用于小数时,一方选择一种格式,当点分隔小数时,另一方选择。说明:

    小数点分隔符:
    (?:,(?:\d){1,3})+\(?:\d\d)\b)

    十进制分隔符:
    (?:(?:\。(?:\d){1,3})+\,(?:\d\d)\b)

    小数部分:
    \(?:\d\d)\b
    \,(?:\d\d)\b

    整数部分:
    (?:,?(?:\d){1,3})+\。
    (?:\。(?:\d){1,3})+\,


    正如你所看到的,两者都是一样的。它并不完美,但只是一个开始。

    您可以使用以下正则表达式:

    \d{1,3}?(?:(?:,?\d{3})*(?:\.\d+)?|(?:\.?\d{3})*(?:,\d+)?)
    
    您需要添加锚来正确匹配,但这取决于您的用例


    锚定线的起点/终点 如果只是锚定到线的起点/终点,可以使用以下选项:

    x=[
    //应匹配:
    '1,234.56',
    '1.234,56',
    '1234.56',
    '1234,56',
    '1.2',
    '1',
    '1234',
    //不应匹配:
    “我的号码是:1234.56很有意思,但是

    解决方案的第一步可以是在A中输入小数点符号

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

    参考您的模式,假设您想要匹配

  • 123
    完全没有小数点符号
  • 123.12
    if小数点:小数点后的一个或多个字符
  • 123.123,12
    如果使用千位分隔符,则必须与小数点不同

  • 我不确定您当前的模式为什么不能与JS一起使用。看起来差异出现在可选的最后一部分
    (?:(?!\2)[,\.](\d*)?$
    中,其中字符串
    \2
    不包含捕获(尚未设置)。如果您删除
    (?!\2)
    进行测试(该模式将不再按需要工作).刚刚注意到了这一点。

    我建议不要试图将所有内容“堆积”在一个正则表达式中,因为它将变得不可读且不易维护。有效数字为:

    • a) 用点分隔,前面没有点,这是
      /(?),或
    • b) 用逗号分隔,以前没有逗号,这是
      (?)
    如果
    A和&b
    ,则数字有效


    有关正则表达式中使用的“负lookback”的更多信息,请参见:

    关于
    \d{1,3}(?:(:,?\d{3})*(?:\。\d+)|(?:\。?\d{3})*(?:,\d+)\b(?,[,)
    {1}
    是多余的。关键是这种基于反向引用的方法在ECMAScript支持的正则表达式中不起作用,因为每个反向引用都是用空字符串初始化的。在PCRE中,在组匹配之前,反向引用为NULL,一旦匹配,值就存在。因此,您需要重新考虑逻辑。在我看来,您需要试试用<试<试<试<试<试<试<试<试<试<试<试<试<试<试<试<试<试<试<试<试<试<试<试<试<试<试<试<试<试<试<上述两两个3{{3},,{3}3},,,,,,,,,,,,(:::::::\d{{{{{1,1,1,2{{1,2{{{{1,2{{{{1,2}}}}},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,{{{{<<<<<<<看,它看起来太黑了。我认为对你来说最简单的方法(假设lookbehind对你来说是可行的)就是使用
    (?如果您可以将它锚定到行的开始/结束
    ^\d{1,3})(?:(?:,?\d{3})*(?:\。\d+)?(?:\。\d})*(?:,\d+)$
    1234567.890呢?抱歉,这还远远没有开始。OP regex是一个开始,而且是一个更高级的模式,唯一的问题是它在ECMAScript one以外的引擎中工作。这就是OP寻求的,一个与JS兼容的等价物。你在说什么?这是100%与JS兼容的模式。是的,但你没有回答这个问题估计。啊,是的。当使用comas或点作为小数/分隔符时,他希望能够选择1种格式或其他格式。接受挑战!我现在更高兴了。请注意,您已经忽略了捕获组。如果OP想要保留它们,这种方法将没有帮助,代码将需要调整。@WiktorStribiżew,但不可能保留第ird捕获组与JS无关,除非使用了库,因为JS引擎
    (?|…)中没有重复的子模式组编号之类的内容
    。必须创建一些带有lookaheads的荒谬正则表达式。@WiktorStribiżew我更新了我的答案,添加了一个基于OP原始模式状态的具有适当组匹配的替代项。您和OP不相等,组1应该只包含小数分隔符之前的数字。@WiktorStribiżew您是对的,我误读了该选项t、 我的道歉-更新。
    ^(?:(?=.*([.,]))\d(?:\d{0,2}(?:(?!\1)[.,]\d{3})*|\d*)\1)?\d+$