2016-05-03 7 views
0

の最後のインスタンスを取得します。私は1つの式におけるタイムスタンプの値と別の式のタイムスタンプの値の最後のインスタンスの最初のインスタンスに一致するようにしようとしています:最初のインスタンスを取得し、文字列

{「緯度」: 50.00001、 'Longitude':2.00002、 'Timestamp':'00:10:00 '}、{' Latitude ':50.0、' Longitude ':2.0、' Timestamp ':'00:20:00'}、{'Latitude ':50.0、'経度 ':2.0、'タイムスタンプ ':'00:25:00'}、{'緯度':50.0、 '経度':2.0、 'タイムスタンプ':'00:37:00 '}

これを行う方法は誰でも知っています。

+0

あなたの例から、あなたは一致させたいものを指摘できますか? – sehrob

+0

これを確認してください:https://regex101.com/r/zL2uZ4/1 – AKS

答えて

2

regexpの欲求を利用してください:*オペレータは、見つけられる数だけ一致します。したがって、ここでのアプローチは、正規表現の最初と最後の明示的なパターンを真ん中の.*と一致させることです。 .*は、regexpの残りの部分にもマッチしてもよいほど多くの文字をスラップします。

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

ここで、$ {}は外挿を表します。これはあなたの言語によって異なります。 Rubyでは#{}になります。私はパターン全体をキャプチャすることを選択しました。代わりに()キャプチャをタイムスタンプ値の周りに置くことができますが、これは読みやすく、維持しやすくなります。この正規表現は、$ patternの2つのインスタンスと一致するので、最初と最後を持つことを保証します。あなたがいない場合

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

コメントで確認する:あなたがより厳密になりたい場合は

、あなただけ.ではなく、完全なパターンをINGの」、同様*を途中でパターンを適用することができこの正規表現の一部を理解する。

使用できるパターンの1つは/\{[^}]+\'Timestamp\'[^}]+\}/です。このパターンでは、タイムスタンプはLASTキーであることが前提です。これが必ずしも真実ではない場合は、このパターンにもう少し追加する必要があります。

だから、最初の例の合計のパターンは次のようになります。

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

または、外挿なし:

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

その後、$1$2は、タイムスタンプのキーと一致する最初と最後のハッシュです。この場合も、これはタイムスタンプ値自体ではなくパターン全体に一致しますが、実際のタイムスタンプ値を抽出するのは簡単です。二、より厳密例えば

、と私は、パターン自体の内部タイムスタンプ値をキャプチャしたくなかった理由は、我々は持っている:

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

または、外挿なしを:

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

$1$2に正しい結果が残っています。なぜなら、キャプチャグループをパターン内に配置しないことを明示的に選択したからです。

+0

これは素晴らしいです。今すぐテストしよう – wingyip

+0

ありがとう。 – wingyip

関連する問題