2016-11-23 4 views
1

私のRssフィード読み取りシステムでは、既存のスクリプトブロックを削除する必要があります。これは、XmlReaderを混乱させると言う人がいるためです。そのためにRegex - 置き換えが遅すぎる

私はウェブ上で発見のコードのこの部分をやっている:

allXml = Regex.Replace(allXml, "(.*)<script type='text/javascript'>.+?</script>(.*)", "$1$2"); 

しかし、これは遅すぎる...これを実行する方法はありますか?私はすでに最初のマッチを実行しようとしましたが、これも同様に遅い、次のように:(*は貪欲数量詞であるため)

Match rgx = Regex.Match(allXml, "(.*)<script type='text/javascript'>.+?</script>(.*)"); 

if (rgx.Success) 
    allXml = Regex.Replace(allXml,"(.*)<script type='text/javascript'>.+?</script>(.*)","$1$2"); 
+0

'allXml'のサイズは? –

+0

これは正しく動作していますが、 'type =" text/javascript "(二重引用符)はありません。または空白。 – maraca

+0

** web **からどのコードを選択したのか理解してください。それが実際に何をするのか。そうすれば、あなたが実際にやっていることを明確にすることができます。 ここで、 '(すべて)Javascript(すべて)'を探していますが、正規表現の検索技術の性質上、時間がかかります。 – Rahul

答えて

1

最初(.*)一度に行全体をつかみ、その後、すべてに対応しようとしてバックトラックを開始しますその後のパターン。文字列が長さが数メガバイトの場合、パターンに定義されている各キャプチャグループに対して適切な文字列チャンクを見つける前に、多くの手順を実行する必要があるため、エンジンには問題があります。

あなたが正規表現迅速かつ汚い修正をしたい場合は、(.*) Sを破棄し、ちょうど<script>...</script>部分文字列を削除するには

string res = Regex.Replace(allXml, "(?s)<script type='text/javascript'>.*?</script>", "") 

を使用しています。 (?s)RegexOptions.Singleline(DOTALL)修飾語のインラインに相当するので、.も改行記号と一致することに注意してください。

ただし、最も良い方法は、HtmlAgilityPackのようなHTMLパーサを使用することです。

関連する問題