Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.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/16.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 使用正则表达式验证逗号分隔的数字列表_Javascript_Regex - Fatal编程技术网

Javascript 使用正则表达式验证逗号分隔的数字列表

Javascript 使用正则表达式验证逗号分隔的数字列表,javascript,regex,Javascript,Regex,这种情况应符合: 1.23 1 1, 1.2,4 1.23, 4 1.23, 4, 1, 2.34 1. 这种情况不应: 1,, 1.234 所以后面可以是逗号或点,逗号后可以是零或一个空格。数字可以是整数,也可以是最多两个分数的浮点数 我已经做了这个正则表达式,但它在两个以上分数的数字上失败: /^?:\d+?:\.[\d{1,2}]*?\.[\d{1,2}]+?:,[\s]:\d+?:\.[\d{1,2}]*?\.[\d{1,2}]+*$/ 使用以下正则表达式: ^\d+(?:\.\d

这种情况应符合:

1.23
1
1,
1.2,4
1.23, 4
1.23, 4,
1, 2.34
1.
这种情况不应:

1,,
1.234
所以后面可以是逗号或点,逗号后可以是零或一个空格。数字可以是整数,也可以是最多两个分数的浮点数

我已经做了这个正则表达式,但它在两个以上分数的数字上失败:

/^?:\d+?:\.[\d{1,2}]*?\.[\d{1,2}]+?:,[\s]:\d+?:\.[\d{1,2}]*?\.[\d{1,2}]+*$/
使用以下正则表达式:

^\d+(?:\.\d{0,2})?(?:,\s*\d+(?:\.\d{0,2})?)*,?$
我将解释一个更简单的要求,而不是给出我所使用的模式的典型的冗长和难以理解的完整分解。假设您想要验证大写字母的CSV列表,例如

A,B,C
您将使用的模式是:

^[A-Z](?:,[A-Z])*,?$

请注意,右边的术语表示允许零个或多个逗号加上另一个字母。您的要求还允许使用尾随逗号,因此上述模式也包括该逗号。

如果您的目标是确定字符串的形式是否正确,而不一定要使用应用于整个字符串的正则表达式来进行确定,则可以使用以下正则表达式执行两个步骤:

r1 = /(?<!,), ?/
r2 = /^\d+(?:\.\d{,2})?$/

这种方法的一个重要优点是,测试比针对整个字符串测试单个正则表达式容易得多,因为r1和r2可以单独测试。这种方法也可能更容易适应未来不断变化的需求。

为什么要匹配1?当用户键入时,我正在验证html中的输入字段,以便他可以开始键入数字1.12。请尝试^\d*?:\。\d{0,2}\s?\d*?:\。\d{0,2}?*$,请参阅。的副本您想说它是的副本吗?不,它不是完全的副本。我同意。不过,你的解释暗示了这一点。然后你的正则表达式不工作,因为它不允许正则表达式的值。我的正则表达式只是一个失败的尝试。Tim的正则表达式覆盖了99%的用例。不过,它允许使用单逗号。但可以将其解释为尾随逗号。@catchall,但允许的示例输入确实包含1,。如果你不想那样,那就把,?从图案的末尾开始。
arr =<<~END.split("\n")
1.23
1
1,
1.2,4
1.23, 4
1.23, 4,
1, 2.34
1,  2.34
1,,
1.234
END
  #=> ["1.23", "1", "1,", "1.2,4", "1.23, 4", "1.23, 4,", "1, 2.34",
  #    "1,  2.34", "1,,", "1.234"] 
arr.each do |s|
  a = s.split r1
  result = a.all? { |t| t.match? r2 } ? "(Match)" : "(No match)"
  puts "%-9s: %-14s %s" % [s, a.inspect, result]
end
string     array          match?
---------------------------------
1.23     : ["1.23"]       (Match)
1        : ["1"]          (Match)
1,       : ["1"]          (Match)
1.2,4    : ["1.2", "4"]   (Match)
1.23, 4  : ["1.23", "4"]  (Match)
1.23, 4, : ["1.23", "4"]  (Match)
1, 2.34  : ["1", "2.34"]  (Match)
1,  2.34 : ["1", " 2.34"] (No match)
1,,      : ["1", ","]     (No match)
1.234    : ["1.234"]      (No match)