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)