簡體   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