2017-08-01 150 views
1

裏面有我喜歡的字符串:替換文本字符串

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

回答

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」 「接下來我們從每個元素中選擇一個這樣的值:「如果你以」/「開始,這意味着你是第一個元素,如果是這樣 - 你應該被返回而不被篡改,否則:取第一個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

好吧,我喜歡你的情況與正則表達式。謝謝 –

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 => ...所有字母 - 對每場比賽
  • "{{{m.Value[1].ToString().ToLower()}{m.Value.Substring(2, m.Value.Length-3)}}}"運行一個lambda - 返回一個新的字符串,採取一個開放的小鬍子,第一個字母小寫,然後字符串的其餘部分,然後密切鬍鬚。
+0

哇。謝謝。你會用什麼? –

+0

只是可能更簡單 - 也許分裂在路徑部分,並檢查哪些是「{tokenized}」。但是,我真的可能會質疑這個需求 - 這看起來像一個路由路徑 - 大多數路由引擎處理任何大小寫就好 –