bugfix> regex > 投稿

次の正規表現があります。

Defaults(.*)Class=\"(?<class>.*)\"(.*)StorePath=\"(?<storePath>.*)\"

そして、次の文字列:

Defaults Class="Class name here" StorePath="Any store path here" SqlTable="SqlTableName"

私は次を達成しようとしています:

class Class name here
storePath Any store path here

しかし、結果として私が得ているのは:

class Class name here
storePath Any store path here SqlTable="SqlTableName"

Sqltableテキストの前に停止する方法は?

言語はC#であり、正規表現エンジンは.NETフレームワークに組み込まれています。

どうもありがとう!

回答 3 件
  • @ ahmed-abdelhameedによって提案された解決策は問題を解決しますが、欲張りでないことは忘れていました。

    Defaults(.*)Class=\"(?<class>.*)\"(.*)StorePath=\"(?<storePath>.*?)\"
    
    

    ありがとう!

  • storePath  グループでは、任意の文字の0回以上のマッチングを行っています(貪欲なマッチング)。貪欲なマッチとは、可能な限り多くの文字を返すため、最後に出現する " に達するまで一致する文字を保持することです。 。

    あなたがする必要があるのは、 .* を置き換えることによって、貪欲なマッチをレイジーマッチに変換することです   .*? と 。遅延一致の意味は、できるだけ少ない文字を返すことです。したがって、あなたの場合、最初に現れる " に達するまで一致した文字を保持します。 。

    正規表現を次のように置き換えます。

    Defaults(.*)Class=\"(?<class>.*)\"(.*)StorePath=\"(?<storePath>.*?)\"
    
    
    参照:

    貪欲の代わりに怠azine。

    正規表現のコンテキストで「遅延」と「貪欲」はどういう意味ですか?

  • 少し読みやすい:

    Class="(.+?)".+?StorePath="(.+?)"
    
    

    。+?貪欲でない一致、基本的に可能な限り一致しないと言っています。 それにより、次の「

あなたの答え