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
に正しい結果が残っています。なぜなら、キャプチャグループをパターン内に配置しないことを明示的に選択したからです。
あなたの例から、あなたは一致させたいものを指摘できますか? – sehrob
これを確認してください:https://regex101.com/r/zL2uZ4/1 – AKS