替换文本字符串

问题描述:

里面有我喜欢的字符串:替换文本字符串

/api/agencies/{AgencyGuid}/contactpersons/{ContactPersonGuid} 

我需要改变{ }文本cameCase

/api/agencies/{agencyGuid}/contactpersons/{contactPersonGuid} 

我怎么能这样做?什么是最好的方式来做到这一点?请帮忙

我对Regex没有经验。所以,我已经尝试到目前为止:

string str1 = "/api/agencies/{AgencyGuid}/contactpersons/{ContactPersonGuid}"; 

string str3 = ""; 
int i = 0; 
while(i < str1.Length) 
{ 
    if (str1[i] == '{') 
    { 
     str3 += "{" + char.ToLower(str1[i + 1]); 
     i = i + 2; 
    } else 
    { 
     str3 += str1[i]; 
     i++; 
    } 
} 

你可以用正则表达式当然。

但是你可以使用LINQ做也是这样:

var result = String.Join("/{", 
str1.Split(new string[1] { "/{" }, StringSplitOptions.RemoveEmptyEntries) 
.Select(k => k = !k.StartsWith("/") ? Char.ToLowerInvariant(k[0]) + k.Substring(1) : k)); 

这到底是怎么做的是:分成3个部分: “/ API /机构/” “AgencyGuid}/contactpersons” “接下来我们从每个元素中选择一个这样的值:“如果你以”/“开始,这意味着你是第一个元素,如果是这样 - 你应该被返回而不被篡改,否则:取第一个char(k [0 ])将其改为小写(Char.ToLowerInvariant())并与其余部分连接在一起。

在年底加入这三个(一个不变和两个改变)字符串

用正则表达式,你可以做到这一点是:

var regex = new Regex(@"\/{(\w)"); 
var result = regex.Replace(str1, m => m.ToString().ToLower()); 

在正则表达式我们搜索模式“/ {\ W”,意思是找到“/ {“和一个字母(\ w)。这个字符将被纳入一个组(因为()周围),然后运行Regex并将这个组替换为m.ToString()。ToLower()

+0

谢谢。当然+1。但是要理解这里发生的事情有点困难。任何其他方式? –

+0

现在你有解释和正则表达式替代:) – Piotr

+0

好吧,我喜欢你的情况与正则表达式。谢谢 –

我可能不会使用正则表达式,但是因为你问了

Regex.Replace(
    "/api/agencies/{AgencyGuid}/contactpersons/{ContactPersonGuid}", 
    @"\{[^\}]+\}", 
    m => 
    $"{{{m.Value[1].ToString().ToLower()}{m.Value.Substring(2, m.Value.Length-3)}}}", 
    RegexOptions.ExplicitCapture 
) 

这里假设c#6中的字符串插值,但是你可以通过连接来做同样的事情。

说明:

  • {[^}]+} - 抢遵循公开胡子是不是接近胡子,然后关闭胡子
  • m => ...所有字母 - 对每场比赛
  • "{{{m.Value[1].ToString().ToLower()}{m.Value.Substring(2, m.Value.Length-3)}}}"运行一个lambda - 返回一个新的字符串,采取一个开放的小胡子,第一个字母小写,然后字符串的其余部分,然后密切胡须。
+0

哇。谢谢。你会用什么? –

+0

只是可能更简单 - 也许分裂在路径部分,并检查哪些是“{tokenized}”。但是,我真的可能会质疑这个需求 - 这看起来像一个路由路径 - 大多数路由引擎处理任何大小写就好 –