2015-03-31 71 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