2016-04-12 9 views
-2

私は現在、htmlファイル内のいくつかのコンテンツにマッチする正規表現に取り組んでいます。一例として、My Regexのパフォーマンスが遅く、誰が最適化できますか?

<h3>  
    {{wf-content-footer_support_title}} 
     FOOTER SUPPORT TITLE 
    {{./wf-content-footer_support_title}} 
    </h3> 

または:

<h3>  
    {{wf-content-footer_support_title}}FOOTER SUPPORT TITLE{{./wf-content-footer_support_title}} 
    </h3> 

現在、私は試合の少量のために働いて、次の正規表現を、持っています。 3つ以上の一致がある場合、正規表現は無限ループでハングアップします。研究の後、私の正規表現が悪い性能を持つことが分かりました。しかし、パフォーマンスを改善するためにそれを変更する方法はわかりません。

{{wf-content-(.+)}}(?:|\s+)(.+)(?:|\s+)+{{\.\/wf-content-.+}} 

誰かが私のために最適化してくれることを願っています。

EDIT:私のコードの パート:

private static Regex _wfContentRegex = new Regex(@"{{wf-content-(.+)}}(?:|\s+)(.+)(?:|\s+)+{{\.\/wf-content-.+}}", RegexOptions.Compiled); 

... ...

foreach (var htmlTemplate in htmlTemplates) 
     { 
      var htmlDocument = new HtmlDocument(); 
      htmlDocument.LoadHtml(htmlTemplate); 

      var mc = _wfContentRegex.Matches(htmlDocument.DocumentNode.InnerHtml); 
      foreach (Match match in mc) 
      { 
       var content = new Content 
       { 
        Key = match.Groups[1].Value, 
        Description = match.Groups[2].Value 
       }; 

       if (ContentManager.GetContents().FirstOrDefault(m => m.Key.ToLower() == content.Key.ToLower()) == null) 
       { 
        AddContent(content); 
       } 
      } 
     } 
+0

@WiktorStribiżew彼はHTMLを解析していません。 – falstro

+0

ありがとう、私はすでにそれを使用して、私は自分のコードで最初の投稿を編集しました。 – SP7

+0

あなたの正規表現はそれほど複雑ではありません... –

答えて

3

あなたのマッチが熱望しているので、あなたが問題を抱えています。つまり、可能な限り多くの文字を一致させることになります。残りの式を一致させることができない場合は、バックトラックして残りの式が以前のポイントで一致するかどうかを確認します。私はあなたの終了タグで後方参照を使用することができ、それはより堅牢にするために

{{wf-content-([^}]+)}}\s*(.*\S)\s*{{\.\/wf-content-[^}]+}} 

のように、より厳格なエンド・オブ・「タグ」の一致を持つことをお勧め。これは、POSIX正規表現で、それはこの

{{wf-content-([^}]+)}}\s*(.*\S)\s*{{\.\/wf-content-\1}} 

のようになります。しかし、最初のものはそれほど厳しくないもののため正常に動作する必要があり、C#の味にどのように行われるかわかりません。

+0

完璧に動作します、ありがとう! C: – SP7

+0

2番目の例はちょうどFYIです:\ s *(。+)\ s *の2番目の '\ s *'は違いはなく、 '(。+)'はそれにマッチします改行がない限り( 'RegexOptions.Singleline'が使用されていない場合) C#では、 'var pattern = @ '{{wf-content-([^}] +)}} \ s *(。*?)\ s * {{\ ./ wf-content- \ 1}} ";'(ただし、ここで 'RegexOptions.Singleline'オプションを使うべきだと思いますが)。 –

+0

@WiktorStribiżewはい、良いキャッチです。私はexagerleとして代わりに非熱心なマッチを使用しました。だから、これを読んでいる人は、Wiktorのコメントや上記のコメントに熱心ではありません。どちらもうまくいくはずです。 – falstro

関連する問題