2015-03-31 64 views
0

我試圖寫一個方法來翻出每一個從大的文本文件相匹配的條件字符串:字符串匹配的正則表達式的語法問題

  • 每個元素都用逗號分隔
  • 第5個要素可以是從1-59
  • 任何數目的下一個21個元素應該是數字1-5
  • 下一個27個元件可以是真或假(否帽)
  • 最後5個元素是整數1 -5

我的代碼:

#this string should be returned by the regex matching 
str="3,15,14,31,40,5,5,4,5,3,4,4,5,2,2,2,1,2,1,1,3,3,3,2,4,3,false,false,false,false,false,true,false,true,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,3,3,3,2,3" 
matchResult=/[1-59]{5}[1-5]{21}[true|false]{27}[1-5]{5}/.match(str) 
matchResult.each{|x| #this doesnt work....why? 
    puts x 
} 
  • 什麼是打印所有匹配的正確方法是什麼? matchResult.each引發錯誤。我認爲它返回了一串匹配。
  • 如何調整我的正則表達式以期望每個值之間的逗號(不在字符串的末尾)?

回答

1

把真或假的捕獲組和非捕獲組像(?:true|false)以便它匹配的精確truefalse子裏面,這[true|false]將匹配它只是否可以是單個字符true|,....

> str="3,15,14,31,40,5,5,4,5,3,4,4,5,2,2,2,1,2,1,1,3,3,3,2,4,3,false,false,false,false,false,true,false,true,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,3,3,3,2,3" 
> str.match(/^(?:[1-5]\d|[1-9])(?:,(?:[1-5]\d|[1-9])){4}(?:,[1-5]){21}(?:,(?:true|false)){27}(?:,[1-5]){5}$/) 
=> #<MatchData "3,15,14,31,40,5,5,4,5,3,4,4,5,2,2,2,1,2,1,1,3,3,3,2,4,3,false,false,false,false,false,true,false,true,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,3,3,3,2,3"> 
+0

我的一些字符串在開始時可能有逗號。有沒有辦法爲此調整正則表達式?我試過:(/ ^(?:[,] *)(?:[1-5] \ d | [1-9])(?:,(?:[1-5] \ d | [1-9 ])){4}(:,[1-5]){21}(:,(?:真|假)){27}(:???,[1-5]){5} $ /)但沒有工作 – Rilcon42 2015-03-31 03:30:17

+0

你的字符串是怎樣的? – 2015-03-31 03:31:52

+0

str =「,3,15,14,31,40,5,5,4,5,3,4,4,5,2,2,2,1,2,1,1,3,3,3 ,2,4,3,假的,假的,假的,假的,假的,真的,假的,真的,假的,假的,假的,假的,假的,假的,假的,真的,假的,假的,假的,假的,假的,假的,假,假,假,假,假,3,3,3,2,3「 – Rilcon42 2015-03-31 03:34:28

1

在問候你的第一個問題:

「什麼是打印所有比賽的正確方法? matchResult.each引發錯誤。我想它返回匹配的數組「

正則表達式.match方法不返回匹配的數組;它返回一個匹配對象(在這種情況下,一個字符串,因爲你打電話.match一個字符串),或者如果沒有匹配(see docs here)爲零。

這意味着matchResult是一個字符串,你不能在一個字符串,這就是爲什麼你得到一個錯誤消息稱.each。更多見this post.each &字符串信息。

+0

謝謝,你指出我在正確的方向。事實證明,我必須使用掃描,而不是匹配 – Rilcon42 2015-03-31 03:27:35

+0

沒問題,很高興它有幫助。而使用'.scan'代替它是有道理的。幹得不錯的工作。 – ktravers 2015-03-31 04:13:24