字符串匹配正则表达式语法问题

时间:2015-03-31 02:56:46

标签: ruby regex

我正在尝试编写一个方法来提取与大文本文件中的条件匹配的每个字符串:

  • 每个元素都以逗号分隔
  • 前5个元素可以是1-59
  • 中的任意数字
  • 接下来的21个元素应该是1-5的数字
  • 接下来的27个元素可以是true或false(无上限)
  • 最后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抛出错误。我以为它返回了一系列匹配。
  • 如何调整我的正则表达式以期望每个值之间都有逗号(不在字符串的末尾)?

2 个答案:

答案 0 :(得分:1)

将true或false置于捕获组或非捕获组(如(?: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">

答案 1 :(得分:1)

关于你的第一个问题:

  

&#34;打印所有比赛的正确方法是什么? matchResult.each抛出错误。我以为它返回了一系列匹配。&#34;

正则表达式.match方法不会返回匹配数组;它返回一个匹配对象(在这种情况下,一个字符串,因为你在字符串上调用.match)或者如果没有匹配(see docs here)则返回nil。

这意味着matchResult是一个字符串,您无法在字符串上调用.each,这就是您收到错误消息的原因。有关.each&amp;的更多信息,请参阅this post字符串。