2017-06-30 22 views
1

私はいくつかのURLを含むデータベースからの文字列を持っています。古いURLを新しいURLに置き換えようとしています。 URLを含む文字列は{s:5:"hello"}と書式化されているため、古い文字列の長さも新しい文字列で置き換える必要があります。古いURLを新しいURLに置き換える

私は明らかに"/wp-content/uploads/2017/06/logo.png".Lengthを返さない

"somelongstring; 35; '%site_url%'; s:26:\"http://localhost/arearaf/wp-content/uploads/2017/06/logo.png\"; someotherlongstring; s:26:\"http://localhost/arearaf/wp-content/uploads/2017/06/logo-150x150.png\";" 

が生じたが、

"somelongstring; 35; '%site_url%'; s:60:\"http://localhost/arearaf/wp-content/uploads/2017/06/logo.png\"; someotherlongstring; s:68:\"http://localhost/arearaf/wp-content/uploads/2017/06/logo-150x150.png\";" 

"$1".Lengthでなければなりません

var url = "http://localhost/arearaf"; 
var text = "somelongstring; 35; '%site_url%'; s:46:\"%site_url%/wp-content/uploads/2017/06/logo.png\"; someotherlongstring; s:54:\"%site_url%/wp-content/uploads/2017/06/logo-150x150.png\";"; 
var result = Regex.Replace(text, @"s:\d+:\" + "\"%site_url%(.*?)\";", "s:" + (url.Length + "$1".Length) + @":\" + "\"" + url + "$1" + @"\" + "\";"); 

を試してみました。置換えごとにキャプチャグループの長さを取得するにはどうすればよいですか?また、問題を正しく処理していますか?そうでない場合、私は何をしますか?


は、この形式{s:5:"hello"}は名前か何かを持っていませんか?私はそれをGoogleにすることはできません。私が見つけることができる最も近いものは、Content Management Systemを表すCMSです。まだ、十分ではありません。

答えて

2

は一致評価を使用してコードに次のように変更します。

  • s: - サブs:
  • var url = "http://localhost/arearaf"; 
    var text = "somelongstring; 35; '%site_url%'; s:46:\"%site_url%/wp-content/uploads/2017/06/logo.png\"; someotherlongstring; s:54:\"%site_url%/wp-content/uploads/2017/06/logo-150x150.png\";"; 
    var result = Regex.Replace(text, "s:\\d+:\"%site_url%(.*?)\";", m => 
         $"s:{url.Length + m.Groups[1].Value.Length}:\"{url}{m.Groups[1].Value}\";"); 
    Console.WriteLine(result); 
    // => somelongstring; 35; '%site_url%'; s:60:"http://localhost/arearaf/wp-content/uploads/2017/06/logo.png"; someotherlongstring; s:68:"http://localhost/arearaf/wp-content/uploads/2017/06/logo-150x150.png"; 
    

    online demo

    パターンs:\d+:"%site_url%(.*?)";)を参照してください。

  • \d+から1桁以上(のみマッチASCII数字にRegexOptions.ECMAScriptでコンパイルする)
  • :"から:"%site_url%サブ
  • (.*?) - あなたが一致する必要がある場合は、改行以外の任意の0以上の文字をキャプチャグループ1(RegexOptions.Singlelineを渡しますあまりに改行)
  • "; - サブ";

一致評価リテラル補間文字列に一致するオブジェクトを渡し:

  • $" - 補間された文字列リテラルの開始
  • s: - リテラルs:
  • {url.Length + m.Groups[1].Value.Length} - URLの長さと、グループ1つの値の長さは文字列に合算し、キャストされた補間一部
  • :\"から:"サブ
  • {url} - url var値
  • {m.Groups[1].Value} - グループ1の値
  • \"; - ";部分文字列
  • " - 文字列リテラルの末尾。無補間文字列リテラルをサポートする古い環境では

string.Formatを使用します。

var result = Regex.Replace(text, "s:\\d+:\"%site_url%(.*?)\";", m => 
    string.Format("s:{0}:\"{1}{2}\";", 
    url.Length + m.Groups[1].Value.Length, url, m.Groups[1].Value)); 
+0

を、私はそれがあるので、 『INT』を入力し、「ラムダ式を変換できません。ビジュアルC#2010 Expressを使用して、このエラーを取得していますデリゲート型ではありません "。私は何が欠けていますか? – akinuri

+0

@akinuri:.NET Frameworkのバージョンとは何ですか? –

+0

4クライアントプロファイル。私はそれを変更する必要がありますか? – akinuri

関連する問題