0

私の正規表現がどうなっているのか教えてください。

expression = (?<=current run date :)([^\.]*?)
searchString = date : 2012-05-26 03:00:00.000 to current run date : 2012-05-26 04:00:00.000 

式は現在、私の正規表現の検索用語です。正しい一致を取得し続けますが、必要なものが返されません。「」が返されます。

以下は値です。これは私が返す正規表現を探しているものです。

value = 2012-05-26 04:00:00.000

したがって、文字列の最後の日付。私はc#.net4を使用しています。

ありがとう。

4

3 に答える 3

1

あなたの質問への答えは最後にあります:

*?

通常、*「一致する文字を0個以上与えて、できるだけ多く与えてください」という意味です。「可能な限り」は「欲張りマッチング」と呼ばれます。その?記号は、欲張り一致から非欲張り一致に切り替わる修飾子であるため、事実上、「一致する文字を0個以上、できるだけ少なくしてください」になります。この場合、最も少ない数は0です。

したがって、修正は?、式からその文字を削除することです。

(?<=current run date :)([^\.]*)

編集:ここで先読みを使用していることにも注意してくださいが、その必要はありません。先読みは高額なので、必要がない限り使用しないでください。正規表現を次のように変更できます。

current run date :([^\.]*)

それでも同じ結果が得られますが、エンジンは結果をより速く返すことができるはずです(オーバーヘッドが少なくなります)。

于 2012-05-30T16:26:58.520 に答える
1

?、ゼロ以上の量指定子*を遅延または非貪欲な方法で一致させます。言い換えれば、一致するものをできるだけ少なくしようとします。この場合、空の文字列が明らかに最小量であるため、これは空の文字列に一致します。そのため、まずそれを取り除く必要があります?

次に、文字シーケンス[^\.]は、ピリオドを除くすべての文字と一致する必要があることをパーサーに伝え.ますが、期待される結果には、.000明らかにピリオドを含むミリ秒の部分が含まれます。その部分は文字列と一致しないため、代わりに2012-05-26 04:00:00.

おそらく、パターンをより具体的にしたいと思うでしょう。この形式で日付を取得することがわかっている場合は、次のようなものが機能するはずです。

expression = current run date :\s+(\d{4}\-\d{2}\-\d{2}\s\d{2}:\d{2}:\d{2}\.\d{3})

または、厳密さを緩めて、次の 2 つの単語に一致させることもできます

expression = current run date :\s+(\S+\s\S+)

注:\dは 10 進文字[0-9]\sはスペース、タブ、改行など\Sの空白文字、空白以外の文字です。

于 2012-05-30T16:28:48.533 に答える
0

必要なものを返すには、最初のキャプチャ グループから値を取得する必要がありますが、文字$1を削除する必要があります。?

ロジックは、貪欲でない演算子で機能すると言っていますが、なぜ機能しないのか説明できません。

*乗数を に変更すると、数値と文字+の間の最初のスペースが返されることがわかります。:

于 2012-05-30T16:23:21.603 に答える