2015-04-23 40 views
1

我需要格式化用戶輸入的一些文本。從字符串中捕獲字符串c#

例如:string str = "{{Lorem Ipsum|bold}}"只是印刷和排版行業的虛擬文本。

我使用IndexOf從字符串中提取了Lorem Ipsum,並以粗體顯示。但是如果我有兩個詞在同一個字符串中進行格式化,則會面臨問

例如:string str ="{{Lorem Ipsum|bold}}"只是"{{printing|blue}}"和排版行業的虛擬文本。

有人可以幫我出任何正則表達式來提取{{Lorem Ipsum|bold}}{{printing|blue}}在C#中的數組。

注意:該模式有時可能是{{printing|blue,bold,http://www.google.com}}

擴展格式化方法。我已經硬編碼測試,後來我會相應地進行優化。

public static string Format(this string value) 
    { 
     System.Uri uriResult = null; 
     bool result = false; 
     string path = ConfigurationManager.AppSettings["path"]; 
     if (value.Length > 0) 
     { 
      if (value.Contains("{{") && value.Contains("|") && value.Contains("}}")) 
      { 
       int totalLength = value.Length; 
       string unformattedText = value.Substring(value.IndexOf("{{"), (value.IndexOf("}}") - value.IndexOf("{{")) + 2); 
       string flowersRemoved = unformattedText.Substring(0, unformattedText.Length - 2); 
       flowersRemoved = flowersRemoved.Substring(2, flowersRemoved.Length - 2); 
       string[] textFormats = flowersRemoved.Split('|'); 
       string text = textFormats[0]; 
       string[] formats = textFormats[1].Split(','); 
       foreach (string format in formats) 
       { 
        result = Uri.TryCreate(format.ToLower(), UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp; 
        if (format.ToLower() == "bold") 
         text = "<b>" + text + "</b>"; 
        else if (format.ToLower() == "red") 
         text = "<font color = \"red\">" + text + "</font>"; 
        else if (format.ToLower() == "blue") 
         text = "<font color = \"blue\">" + text + "</font>"; 
        else if (result) 
         text = "<a href = \"" + format + "\" target = \"_blank\">" + text + "</a>"; 
        else if (System.IO.File.Exists(path + format)) 
        { 
         string fileName = System.IO.Path.GetFileName(path + format); 
         text = "<a href = \" \\s\\Download\\" + fileName + "\">" + text + "</a>"; 
        } 
       } 

       value = value.Replace(unformattedText, text); 

      } 
      return value; 
     } 
     return value; 
    } 
+0

你能告訴你迄今爲止編寫的代碼? –

+0

如果該模式爲「{{printing | blue,bold,http://www.google.com}}」,那麼您想在數組中使用什麼?例如,結果數組看起來是這樣的:'var printing = string [] {「blue」,「bold」,「http://www.google.com」}'? –

+0

如果您只需將'printing'和'blue,bold,http:// www.google.com'放置在數組中,我懷疑您需要一個正則表達式,除非您已經在內容中轉義了管道符號。會有嗎? –

回答

1

您可以使用正則表達式旁邊替換功能

string str = "{{Lorem Ipsum|bold}}"; 
string path = ConfigurationManager.AppSettings["path"]; 
var formattedString = Regex.Replace(str, @"{{(?<symbol>[^|]+?)\|(?<formats>.+?)}}", m => 
{ 
    var formatedPattern = m.Groups["formats"].Value.Split(',').Aggregate("{0}", (acc, f) => 
    { 
     switch (f.ToLower()) 
     { 
      case "bold": return "<b>" + acc + "</b>"; 
      case "red": return "<font color = \"red\">" + acc + "</font>"; 
      case "blue": return "<font color = \"blue\">" + acc + "</font>"; 
     }; 

     Uri uriResult; 
     if (Uri.TryCreate(f.ToLower(), UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp) 
     { 
      return "<a href = \"" + f + "\" target = \"_blank\">" + acc + "</a>"; 
     } 
     else if (System.IO.File.Exists(path + f)) 
     { 
      string fileName = System.IO.Path.GetFileName(path + f); 
      return "<a href = \" \\s\\Download\\" + fileName + "\">" + acc + "</a>"; 
     } 
     return acc; 
    }); 
    return string.Format(formatedPattern, m.Groups["symbol"].Value); 
}); 
+0

非常感謝! 正是我想要的。非常感謝你 – Ram

+1

小提琴:-) https://dotnetfiddle.net/ttKZZo –

+0

謝謝@Shaun – Ram

1

圖案有時可以是{{printing|blue,bold,http://www.google.com}}

嘗試Split

The following fiddle使用Split()不是正則表達式,因爲正則表達式往往難以閱讀。結果key字符串包含要格式化的字,並且values字符串數組包含相關設置。

string str = "{{printing|blue,bold,http://www.google.com}}"; 

// get your settings 
int pFrom = str.IndexOf("{{") + "{{".Length; 
int pTo = str.LastIndexOf("}}"); 
string settings = str.Substring(pFrom, pTo - pFrom); 

// split 
string[] parts = settings.Split('|'); 
string key = parts[0]; 
string[] values = parts[1].Split(','); 

// for demo purposes only 
Console.WriteLine(key); 
foreach(var v in values) 
{ 
    Console.WriteLine("-" + v); 
} 

輸出

printing 
-blue 
-bold 
-http://www.google.com 

如果你釘在這個月底你可以有你想要的HTML:

// create html 
var html = string.Format(@" 
<a href='{3}' target ='_blank'> 
    <font color='{1}'> 
     <b>{0}</b> 
    </font> 
</a>", key, values[0], values[1], values[2]); 

Console.WriteLine(html); 

輸出

<a href ='http://www.google.com' target = '_blank'> 
    <font color ='blue'> 
     <b>printing</b> 
    </font> 
</a> 

Watch it run here

+0

實際上,它與OP顯示相同,甚至更糟,因爲大括號不會被刪除。 –

+0

如果我在一個字符串中{{printing | blue,bold,http://www.google.com}},我會將其格式設置爲'printing' – Ram

+0

@stribizhev現在刪除大括號。 :-)。謝謝。 –