我的字符串如下:
/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++;
}
}
答案 0 :(得分:1)
你当然可以用正则表达式来做。
但你也可以像这样使用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” “ContactPersonGuid}” 之后我们从每个元素中选择这样的值:“如果以”/“开头,则意味着你是第一个元素。如果是这样的话 - 你应该在没有篡改的情况下返回。否则:取第一个字符(k [0])改变它小写(Char.ToLowerInvariant())并与其余部分连接。
最后加入这三个(一个未更改且两个已更改)字符串
使用Regex,您可以这样做:
var regex = new Regex(@"\/{(\w)");
var result = regex.Replace(str1, m => m.ToString().ToLower());
在正则表达式中我们搜索模式“/ {\ w”表示找到“/ {”和一个字母(\ w)。此char将被带入一个组(因为()周围)并在此之后运行Regex并将此组替换为m.ToString()。ToLower()
答案 1 :(得分:1)
我可能不会使用正则表达式,但是因为你问了
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 => ...
- 在每场比赛中运行的lambda "{{{m.Value[1].ToString().ToLower()}{m.Value.Substring(2, m.Value.Length-3)}}}"
- 通过打开小胡子,第一个小写字母,然后是字符串的其余部分,然后是一个小胡子来返回一个新字符串。