我试图在一个小的 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/