【问题标题】:String matching regex syntax issue字符串匹配正则表达式语法问题
【发布时间】:2015-03-31 12:37:20
【问题描述】:

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

  • 每个元素都用逗号分隔
  • 前 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 引发错误。我以为它返回了一个匹配数组。
  • 如何调整我的正则表达式以期望在每个值之间(而不是字符串末尾)有一个逗号?

【问题讨论】:

    标签: ruby regex


    【解决方案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-5]\d|[1-9])(?:,(?:[1-5]\d|[1-9 ])){4}(?:,[1-5]){21}(?:,(?:true|false)){27}(?:,[1-5]){5}$/)但这没有用
    • 你的字符串是什么样子的?
    • 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"
    • 我做到了,谢谢!
    【解决方案2】:

    关于你的第一个问题:

    “打印所有匹配的正确方法是什么?matchResult.each 会抛出一个错误。我以为它返回了一个匹配数组。”

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

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

    【讨论】:

    • 谢谢,您为我指明了正确的方向。事实证明我不得不使用扫描而不是匹配
    • 没问题,很高兴它有帮助。而使用.scan 是有意义的。很好地解决了这个问题。
    猜你喜欢
    • 2014-05-10
    • 2016-07-31
    • 2016-02-14
    • 2023-03-18
    • 2012-06-05
    • 2013-12-25
    • 1970-01-01
    相关资源
    最近更新 更多