1

次の文字列が[datetime:yyyyMMddhhmmss]あり、正規表現でチェックしたいと思います。複数の正規表現の一致でそれを実行できることはわかっていますが、可能であれば 1 つの式で実行したいと考えています。文字列には、 so のようにダッシュ/ハイフンとアンダースコアを含めることもできます[datetime:yyyy_MM_dd_hh-mm-ss]。スペースは、コードを先頭にして削除されます。また、日時指定子グループ (yyyy のようなグループ) は、 after[datetime:と beforeの形式のどこかに置くことができます]。したがって、これも有効な形式になります。[datetime:dd_MM_yyyy_hh-mm-ss]

確認事項:

  • [datetime:] が存在することを確認したい。パターン使えます\[datetime:[\w\-]+\]
  • yyyy MM dd hh mm ss の 6 つのグループが存在することを確認したいのですが、順序がランダムである可能性があります。

\[datetime:[\w\-]+(?<=.?M{2}.?)\]コードのどこかにあるMMの存在と一致するように、正の先読み/後読みでそれをやろうとしていました。しかし、これはうまくいきません。

私を助けることができる正規表現の第一人者はいますか?

解決:

Bergi の回答に基づいて、この正規表現パターン\[datetime:(?=.*?y{4})(?=.*?M{2})(?=.*?d{2})(?=.*?h{2})(?=.*?m{2})(?=.*?s{2})[\w\-]+\]ができました。これで問題ありません。以下のすべてのパターンに一致するため:

  • [日時:yyyyMMddhhmmss]
  • [日時:mmssyyyyddMMhh]
  • [日時:mm_ss-yyyy_dd-MM-hh]
  • [日時:mmssyyyyddMM_hours_hh]

上記のパターンのすべてが理にかなっているわけではありませんが、これはまさに私が探していたものです!

4

2 に答える 2

1

\[datetime:[\w\-]+(?<=.?M{2}.?)\]コードのどこかにあるMMの存在と一致するように、正の先読み/後読みでそれをやろうとしていました。しかし、これはうまくいきません。

後読みは、さまざまなエンジンでいくつかのレベルで制限されているため (サポートされている場合)、操作が面倒です。また、現在のコードでは、日時文字列の最後の 3 文字に MM が含まれている必要があります\[datetime:[\w\-]*M{2}[\w\-]?\]

先読みをより適切に使用します。

\[datetime:(?=.*?y{4})(?=.*?M{2})(?=.*?d{2})…[\w\-]+\]
于 2013-03-28T12:04:26.237 に答える
0

\[datetime:[\w\-]+(?<=.?M{2}.?)\]コードのどこかにある MM の存在と一致します。しかし、これはうまくいきません。

は入力の[\w\-]+最後に一致するため、先読みには一致するものがありません。

試してみませんか:

\[日時:(?<=.*M{2})[\w\-]+\]

すなわち。は、 の後で、エンディングM{2}の前のどこかにあります。:]

しかし、最終的には、次のようになります。

可能であれば、1つの式でそれを行う

これを維持するのが難しくなる可能性があります。文字列操作を使用して、プレフィックス[datetime:とサフィックスを明示的に一致させてから、残りの各要素で]使用する方が簡単です。String.IndexOf

于 2013-03-28T11:34:11.177 に答える