替换字符串中camelCase中的文本

时间:2017-08-01 22:26:11

标签: c# regex replace

我的字符串如下:

/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++;
    }
}

2 个答案:

答案 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)}}}" - 通过打开小胡子,第一个小写字母,然后是字符串的其余部分,然后是一个小胡子来返回一个新字符串。