C# 用新URL替换旧URL

C# 用新URL替换旧URL,c#,regex,C#,Regex,我有一个数据库中的字符串,其中包含一些URL。我正在尝试用新的URL替换旧的URL。因为包含URL的字符串的格式是{s:5:“hello”},所以我还需要用新的字符串长度替换旧的字符串长度 我试过了 var url = "http://localhost/arearaf"; var text = "somelongstring; 35; '%site_url%'; s:46:\"%site_url%/wp-content/uploads/2017/06/logo.png\"; some

我有一个数据库中的字符串,其中包含一些URL。我正在尝试用新的URL替换旧的URL。因为包含URL的字符串的格式是
{s:5:“hello”}
,所以我还需要用新的字符串长度替换旧的字符串长度

我试过了

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" + @"\" + "\";");
导致

"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
显然不会返回
”/wp content/uploads/2017/06/logo.png.Length
。如何获取每次替换的捕获组长度?我是否正确处理了问题?如果没有,我该怎么办



这种格式不是有名字吗?我不能用谷歌搜索它。我能找到的最接近的东西是CMS,我猜它代表内容管理系统?不过,这还不够

使用匹配计算器并按以下方式修改代码:

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";

模式
s:\d+:%site\u url%(.*);
):

  • s:
    -子字符串
    s:
  • \d+
    -1个或多个数字(使用
    RegexOptions.ECMAScript
    编译以仅匹配ASCII数字)
  • :“
    -a
    :%site\u url%
    子字符串
  • (.*)
    -组1捕获除换行符以外的任何0个或多个字符(如果需要匹配换行符,请传递
    RegexOptions.Singleline
  • ”;
    -子字符串
匹配计算器将匹配对象传递给插值字符串文字:

  • $”
    -插入字符串文字开始
  • s:
    -literal
    s:
  • {url.Length+m.Groups[1].Value.Length}
    -将url长度和组1值长度相加并转换为字符串的插入部分
  • :\”
    -
    :“
    子字符串
  • {url}
    -
    url
    var值
  • {m.Groups[1].Value}
    -组1值
  • \”-a
    “;
    子字符串
  • -字符串文字的结尾
对于不支持插值字符串文字的旧环境,请使用
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));

我使用的是Visual C#2010 Express,出现以下错误“无法将lambda表达式转换为类型‘int’,因为它不是委托类型”。我遗漏了什么?4客户资料。我应该更改它吗?好的,看起来lambda还可以,但是您的IDE不支持插值字符串文字。将
$”
更改为
字符串格式。查看我的最新编辑。