ruby - 这个正则表达式有什么问题?

标签 ruby regex

我试图在一个小的 ruby​​ 脚本中实现它,并在 http://www.rubular.com/ 上测试了它,它完美地工作。不确定为什么它不在实际脚本中执行。

正则表达式:/(motion|links|sound|button|symbol)|(0.\d{8})|(\s\d{1}\s)|(\d{10}\s)/

它反对的文本:

试用编号:1 |试用类型:运动 |诡计? 1个 点击时间:0.87913100 1302969732

试用编号:7 |试用类型:按钮 |诡计? 0 点击时间:0.19817800 1302987043

等等等

我想抓取的内容:只有数字,以及“试用类型”后的单个词。因此,对于示例的第一行,我只想返回“1 motion 1 0.87913100 1302969732”。我还想在每次试验的第一个数字前保留空格。

我的简短 ruby​​ 脚本:

File.open('log.txt', 'r') do |file|
  contents = file.readlines.to_s
  regex = Regexp.new(/(motion|links|sound|button|symbol)|(0\.\d{8})|(\s\d{1}\s)|(\d{10}\s)/)
  matchdata = regex.match(contents).to_a
  matchdata.each do |match|
    if match != nil
      puts match
    end
  end
end

不过它只输出两个“1”。嗯...我知道它能正确读取文件内容,当我尝试使用替代的简单正则表达式时,它运行良好。

感谢您对我的帮助!! :)

最佳答案

您想使用 String#scan

 matchdata = contents.scan(regex)

此外,@Mike Penington 是正确的,如果操作正确,您不必执行 if match != nil。您还必须清理您的正则表达式。正则表达式中的管道字符是一个特殊字符,表示匹配左侧或右侧,您必须转义垃圾管道字符。

关于ruby - 这个正则表达式有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5689671/

相关文章:

ruby - rspec 中 use_transactional_fixtures 的默认值是多少?

python - 在python中读取.dat文件

regex - 用正则表达式修剪电话号码

regex - 正则表达式在Powershell中不起作用

正则表达式匹配特定模式,但排除特定情况

python - 正则表达式替换Python中分隔符之间的文本

ruby-on-rails - Rails - 如何使用嵌套属性验证表单?

Ruby 异常初始化错误

Ruby 正则表达式,有没有办法只匹配文字匹配?

ruby - 如何使用动态键对 Ruby Hash 进行排序