繁体   English   中英

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

[英]Validate comma separated list of numbers with regex

这种情况应该匹配:

1.23
1
1,
1.2,4
1.23, 4
1.23, 4,
1, 2.34
1.

这种情况不应:

1,,
1.234

因此,逗号后可以有尾随逗号或点,零或一个空格。 数字可以是整数或最多带有两个小数的浮点数。

我已经做了这个正则表达式,但它在超过两个分数的数字上失败: https : //regex101.com/r/CLTP2j/75

/^(?:\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匹配

r1读作,“匹配一个逗号,后跟最多一个空格,前面没有逗号。

r2读作,“匹配字符串开头的一个或多个数字,可选地后跟小数点,然后是 0、1 或 2 位数字,然后是字符串的结尾”。

例如,在 Ruby 中,获得以下内容:

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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM