替换文本字符串
里面有我喜欢的字符串:替换文本字符串
/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()
我可能不会使用正则表达式,但是因为你问了
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 - 返回一个新的字符串,采取一个开放的小胡子,第一个字母小写,然后字符串的其余部分,然后密切胡须。
哇。谢谢。你会用什么? –
只是可能更简单 - 也许分裂在路径部分,并检查哪些是“{tokenized}”。但是,我真的可能会质疑这个需求 - 这看起来像一个路由路径 - 大多数路由引擎处理任何大小写就好 –
谢谢。当然+1。但是要理解这里发生的事情有点困难。任何其他方式? –
现在你有解释和正则表达式替代:) – Piotr
好吧,我喜欢你的情况与正则表达式。谢谢 –