尝试应用以下正则表达式时遇到问题:
(1234).*?(abcd)?
到下面的字符串:
1234567abcd
我的期望是上面应该产生两个匹配:
- 1234
- A B C D
但是,这不起作用。您可能会建议“好吧,只需删除尾随?
字符?” - 但我希望这第二种模式是可选的。
这是怎么做到的?
重申:
(1234).*?(abcd)
... 给出了想要的结果,但我搜索的字符串并不总是包含abcd
.
如果有人想知道,这是一个大图问题的简化示例。如果需要,我会解释。
====
我认为这个问题需要进一步澄清。这是我在 ruby 中尝试做的更完整的示例。
鉴于我的日志文件中的以下两个“篡改”行:
Aug 28 00:00:05 app-system-1 app-prod[7660]: Completed 200 OK in 150ms (Views: 24.6ms | ActiveRecord: 66.1ms)
Aug 28 00:05:06 app-system-1 app-prod[10639]: Completed 302 Found in 81ms (ActiveRecord: 74.6ms)
我试图在 ruby 中编译一个正则表达式,如下所示:
d=Regexp.new('(?<timestamp>\w{1,3}\s\d{1,2}\s\d\d:\d\d:\d\d).*(?<in>in [0-9]*).*(?<views>Views: [0-9]*).*(?<activerecord>ActiveRecord: [0-9]*)')
显然,在某些情况下,“视图”文本将包含在内,而在其他行中,则不存在。
我希望能够做类似的事情:
v=d.match(line)
if !v.nil?
puts v[:timestamp]+ " " + v[:in] + " " + v[:views] + " " + v[:activerecord]
这显然是一个不完整的例子,但希望这可以澄清。