0

私はスピンアップした4つの正規表現を持っており、それらはうまく機能しますが、一部のアプリケーションではCPUをペッグアウトしています。それらが非常に見栄えの良い正規表現であることは知っていますが、より良い方法はわかりません。これらの正規表現を最適化するためにできることはありますか?

public static Regex schemaOrg = new Regex(@"\s*itemtype\s*=\s*('|"")\s*http://schema.org/\s*", RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.Compiled);
public static Regex dataVocabulary = new Regex(@"\s*itemtype\s*=\s*('|"")\s*http://data-vocabulary.org/\s*", RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.Compiled);

基本的に探しているもの:

itemtype="http://schema.org/"
itemtype="http://data-vocabulary.org/"

ただし、スペースをいくらでも使用すると、htmlでも有効になります。

例えば:

itemtype   ="http://schema.org/"
itemtype=   "http://schema.org/"
itemtype="   http://schema.org/   "

すべて有効になります。

更新:それでもCPUが不良になります。

\s+itemtype\s*=\s*(?:'|"")\s*http://schema\.org/
4

2 に答える 2

2

これまでのところ、私はいくつかのことしか考えられません。

  • 末尾\s*(inschema.org/\s*vocabulary.org/\s*)は必要ありません。削除してください。末尾の引用もチェックしていないので、これを想定しました。
  • . (dot)正規表現では特別な意味があり、のようにエスケープ\.schema.orgますdata-vocabulary.org
  • 最初の\s*ものは、パターンも。と一致するため、意味がありませんsomeitemtype。に置き換えるか、パターンの開始に\s+単語境界を使用してみてください。\b
  • あなたがそれについて妄想しているなら、('|"")それをに置き換えることによって、正規表現がグループをキャプチャするのを防ぐこともできます(?:'|"")

編集:怠惰なマッチングを試して、それが役立つかどうかを確認することもできます。あなたの正規表現がCPUを詰まらせるケースを想像することができます。以下のサンプル正規表現を試してください。

\s+?itemtype\s*?=\s*?(?:'|"")\s*?http://schema\.org/

これで問題が解決しない場合は、この問題のコンテキストでコードとサンプル文字列を投稿してください。

于 2012-12-07T16:51:50.193 に答える
0

考えられる改善点は次のとおりです。

regex.matchを実行する前に、すべての「」を「」に置き換えてください

次に、正規表現はこれらすべての\sを必要としません

于 2012-12-07T16:46:04.457 に答える