URL のセット (数百万) があり、正規表現のセット (> 60k 正規表現) を実行して、URL が正規表現に一致するかどうかを判断し、それらを置換パターンに置き換える必要があるシナリオがあります。
foreach(url in urls)
{
foreach(regex in regexes)
{
newurl = Regex.Replace(url, matchpattern, replacement);
store newurl;
break;
}
}
パターンは次のようになります。
Regex.Replace(url, "^http([s]?):/(/www.|/)en.wikipedia.org(.*)", "http$1://en.m.wikipedia.org$3" );
メモリと実行時間に制約があります。現在、上記の疑似コードコードのようなものしか実装していませんが、6k の正規表現 (20Mb) でもメモリ消費が高すぎます。この種の問題をすでに処理しているライブラリがあるかどうか、またはここでメモリとランタイムを最適化するために構築する必要があるデータ構造の種類について誰かが提案しているかどうかを知りたいです。
いくつかの例を示します。左側は一致パターン、右側は置換パターンです。
^http([s]?):/(/www.|/)youtube.com/watch\?(. ) http$1://m.youtube.com/watch?$3 ^http([s]?): /(/www.|/)facebook.com/(pages/. |[^/] $) http$1://m.facebook.com/$3 ^http([s]?):/(/www.| /)twitter.com/(. ) http$1://mobile.twitter.com/$3 ^http([s]?):/(/www.|/)yellowpages.com/(. ) http$1:// m.yellowpages.com/$3 ^http([s]?):/(/www.|/)imdb.com/(タイトル|名前)/(. ) http$1://m.imdb.com/$3/ $4 ^http([s]?):/(/www.|/)facebook.com/pages/(. ) http$1://m.facebook.com/pages/$3 ^http([s]?): //detail.chiebukuro.yahoo.co.jp/qa/question_detail/q(\d+)$ http$1://m.chiebukuro.yahoo.co.jp/detail/q$2 ^http([s]?): //www.ebay.com.au/itm/([^/] )/(\d+)$ http$1://m.ebay.com.au/itm/$2/$3 ^http([s]?) ://www.youtube.com/user/([^/?&]*)$ http$1://m.youtube.com/user/$2