获取第一个实例并获取最后一个字符串实例

时间:2016-05-03 11:21:59

标签: regex

我试图在一个表达式中匹配Timestamp值的第一个实例,并在另一个表达式中匹配Timestamp值的最后一个实例:

{'纬度':50.00001,'经度':2.00002,'时间戳':' 00:10:00'},{ '纬度':50.0,'经度':2.0,'时间戳':' 00:20:00'},{'纬度':50.0,'经度':2.0,'时间戳':' 00:25:00'},{'纬度' :50.0,'经度':2.0,'时间戳':' 00:37:00'}

任何人都知道如何做到这一点。

1 个答案:

答案 0 :(得分:2)

利用正则表达式的贪婪:*运算符将采用尽可能多的匹配。所以这里的方法是将正则表达式开头和结尾的显式模式与中间的.*进行匹配。 .*会冒出尽可能多的字符,因为它可以与正则表达式的其余部分匹配。

/(${pattern}).*(${pattern})/

此处,$ {}表示外推。这取决于您的语言。在Ruby中它将是#{}。我选择捕捉整个模式;您可以将()捕获放在时间戳值周围,但我发现这更容易阅读和维护。这个正则表达式将匹配$ pattern的两个实例,其中包含尽可能多的内容,从而保证您拥有第一个和最后一个。

如果你想更加严格,你也可以在中间强制执行模式,*使用完整模式,而不仅仅是.

/${pattern},\s*(?:${pattern},\s*)*${pattern}/

在评论中询问您是否了解此正则表达式中的任何内容。

我们可以使用的一种模式是/\{[^}]+\'Timestamp\'[^}]+\}/。请注意,此模式假定Timestamp是最后一个密钥;如果并非总是如此,则需要为此模式添加更多内容。

所以第一个例子的总模式是:

str =~ /(${pattern}.*(${pattern})/

或者,没有外推:

str =~ /({[^}]+'Timestamp'[^}]+}).*({[^}]+'Timestamp'[^}]+})/

然后,$1$2是与Timestamp键匹配的第一个和最后一个哈希值。同样,这匹配整个模式而不仅仅是时间戳值本身,但它应该直接从那里提取实际的时间戳值。

对于第二个更严格的例子,以及我不想在模式本身内捕获时间戳值的原因,我们有:

str =~ /(${pattern}),\s*(?:${pattern},\s*)*(${pattern})/

或者,没有外推:

str =~ /({[^}]+'Timestamp'[^}]+}), *(?:{[^}]+'Timestamp'[^}]+}, *)*({[^}]+'Timestamp'[^}]+})/

我们在$1$2中仍然有正确的结果,因为我们明确选择了NOT将捕获组放在模式中。