2016-06-09 70 views
1

我想獲得一個字符串並將它分割成一個數組僅當它的格式是有效的紅寶石/正則表達式語法分析字符串

有效格式的字符串包括:

  • key: Bob value: 5000
  • key: Jane value: 6000,700,100

無效格式,除了key:value:被拼錯了:

  • key: Bob value: 6000,,,,100

我一直在使用gets取得一行並試圖使用此代碼:

if line =~ /key:\s\d+\svalue:\s([\d+]+,?)*/ 
# do stuff 
end 

我使用===也試過,但都只是返回true /不爲零有效和無效的字符串。我怎樣才能確保多個連續的逗號被認爲是無效的?

回答

-1

"affirmative" match

​​

"negative" match

^(?!.*,,).*$ //simple negative lookahead

+0

好奇:爲什麼^ $造成如此大的差異? – Klnkmnk

+0

他們強制正則表達式跨越整個輸入字符串... http://www.regular-expressions.info/anchors.html – sweaver2112

+2

'^'和'$'並不意味着在Ruby中字符串的開始/結尾,它們意味着*行*的開始/結束。你幾乎總是想在Ruby中使用'\ A'和'\ z'。 –

0

我傾向於使用劈的情況是這樣的:

str = "key: Bob value: 5000,330,200" 
=> "key: Bob value: 5000,330,200" 

arr = str.split 
=> ["key:", "Bob", "value:", "5000,330,200"] 

if arr[0] == "key:" && arr[2] == "value:" && arr[3].split(",").none?(&:empty?) 
    # do stuff 
end 

我更容易suss out。

+1

考慮'key,value,* numbers = str.split(/ \ s *,\ s * | \ s + /)',然後'if key =='key:「&& value ==」value:「&& numbers。沒有?(:空?)'。 –

+0

@CareySwoveland - 謝謝,修正。 – seph