1

私が持っている正規表現は.*MSIE (\d+\.\d+).*(Trident/\d\.\d)?.*

照合する文字列:
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)

したがって、グループ 2 には Trident/5.0 という値が含まれていると予想されます。しかし、ヌルとして来ています。ここで私が間違っている手がかりはありますか? ?afterを削除する(Trident/\d\.\d)と、グループ 2 として取得されます。

4

2 に答える 2

3

問題

問題は.*、オプションの前にあることです(Trident/\d\.\d)(Trident/\d\.\d)正規表現エンジンは、あきらめる前に一致するものがあるかどうかをチェックしようとせず、オプションのグループを空の文字列として一致させます。

このトレースは、正規表現エンジンがどのように機能するかを示します。

  • が一致した後.*MSIE (\d+\.\d+)、残りのテキストは次のとおりです。

    ; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)
    
  • .*貪欲なので、文字列の最後まですべてに一致します。テキストが残っていません。

  • (Trident/\d\.\d)?貪欲なので、Trident/\d\.\d最初に一致しようとしますが、失敗しました。ただし、空の文字列と一致する可能性があります (空の文字列は、行末であっても、どこにでもある可能性があります)。したがって、この部分で空文字列が一致します。

  • .*行末にいるため、空の文字列にも一致します。

.*途中で遅延量指定子に変更する.*MSIE (\d+\.\d+).*?(Trident/\d\.\d)?.*と、同じ理由で機能しなくなります。

  • 一致した後.*MSIE (\d+\.\d+)は、まあ、同じことです。

  • .*?は怠惰なので、最初に空の文字列を試します。残りのテキストは上記と同じです (何も消費されません)。

  • (Trident/\d\.\d)?貪欲で、(Trident/\d\.\d)最初に試行して失敗し、空の文字列と一致します。

  • .*文字列の残りの部分に一致.*MSIE (\d+\.\d+)します。

ソリューション

(Trident/\d\.\d)簡単な方法を取る前にエンジンに強制的にチェックさせるために、全体を.*(Trident/\d\.\d)オプションにすることができます。これにより、エンジンは一致するすべての可能性をチェックするように促され、(Trident/\d\.\d)あきらめて空の文字列に満足する前に。

.*MSIE (\d+\.\d+)(.*(Trident/\d\.\d))?

正規表現のトレース:

  • .*MSIE (\d+\.\d+)同上。

  • (.*(Trident/\d\.\d))?貪欲なので.*(Trident/\d\.\d)、空の文字列に行く前に試します。入力文字列にパターンがあれば、間違いなく一致が見つかります。存在しない場合.*(Trident/\d\.\d)は失敗し、空の文字列に頼ります。

エンジンが非キャプチャ グループをサポートしている場合:

.*MSIE (\d+\.\d+)(?:.*(Trident/\d\.\d))?

必要なのは だけなのでTrident...、全体をキャプチャする必要はありません。

于 2013-03-20T16:06:38.600 に答える
2

あなたは実際に問題を解決しました。. . 「?」を削除する . . . (Trident/\d\.\d)がオプションの場合、.*MSIE (\d+\.\d+).*(Trident/\d\.\d)?.*実際には と違いはありません.*MSIE (\d+\.\d+).*

これに対処する最も簡単な方法は、 と の 2 つの検索に分割することMSIE (\d+\.\d+)です(Trident/\d\.\d)。より複雑な単一の一致を行うこともできますが、単純にするために、2 つの別個のものを使用することをお勧めします。

于 2013-03-20T16:06:48.430 に答える