我有一个像这样的字符串:
ticket:1 priority:5 delay:'2019-08-31 02:53:27.720422' delay:'2019-08-30 00:04:10.681242'
Run Code Online (Sandbox Code Playgroud)
我成功提取ticket,priority但失败了delay。
我想要的是将延迟提取为数组,因此输出将如下所示:
#delays =>
[
"delay:'2019-08-31 02:53:27.720422'",
"delay:'2019-08-30 00:04:10.681242'"
]
Run Code Online (Sandbox Code Playgroud)
到目前为止我尝试过什么?
str = "ticket:1 priority:5 delay:'2019-08-31 02:53:27.720422' delay:'2019-08-30 00:04:10.681242'"
delays = str.scan(/delay:\w+(?:'\w+)*/).flatten
Run Code Online (Sandbox Code Playgroud)
我该如何提取它们?注意,不能保证日期格式与示例中的相同。日期格式可以是任何格式。因此,我们应该关注单引号之间的字符串。
如果可能的结果可能是这样的(这样我就不必再次提取日期了。):
#delays =>
[
"2019-08-31 02:53:27.720422",
"2019-08-30 00:04:10.681242"
]
Run Code Online (Sandbox Code Playgroud)
这个表达可能很接近你的想法:
\bdelay\s*:\s*['][^']*[']
Run Code Online (Sandbox Code Playgroud)
如果您有其他字符(例如"值delay),它将进入 char 类:
\bdelay\s*:\s*['"][^'"]*['"]
Run Code Online (Sandbox Code Playgroud)
或者:
\bdelay\s*:\s*'(\d{4}-\d{1,2}-\d{1,2})\s*([^']*)'
Run Code Online (Sandbox Code Playgroud)
或者:
\bdelay\s*:\s*'(\d{4}-\d{1,2}-\d{1,2}\s*[^']*)'
Run Code Online (Sandbox Code Playgroud)
或者更简化:
\bdelay\s*:\s*'([^']*)'
Run Code Online (Sandbox Code Playgroud)
re = /\bdelay\s*:\s*'([^']*)'/
str = 'ticket:1 priority:5 delay:\'2019-08-31 02:53:27.720422\' delay:\'2019-08-30 00:04:10.681242\''
str.scan(re) do |match|
puts match.to_s
end
Run Code Online (Sandbox Code Playgroud)
["2019-08-31 02:53:27.720422"]
["2019-08-30 00:04:10.681242"]
Run Code Online (Sandbox Code Playgroud)
如果您想探索/简化/修改表达式,请在regex101.com的右上角面板上进行解释 。如果您愿意,您还可以在此链接中观看它如何与某些示例输入进行匹配。