2016-02-17 36 views
1

首先,我想從字符串之間的分隔符提取子字符串到參數中,並使字符串變得像String.Format的字符串。創建像字符串和提取子字符串String.Format

來源:

<Hello> [World]! 

輸出:

結果字符串

<{0}> [{1}]! 

在陣列提取的參數

0: Hello 
1: World 

有很多字符串包含未知數量的參數。此外,還有兩種類型的分隔符:<>[]

我使用正則表達式搜索字符串提取示例,但其中大多數是基於靜態字符串格式。但是,字符串的格式是未知的,在這種情況下可能包含也可能不包含任何分隔符。

編輯: 可能由其他分隔符包裹分隔符,但分隔符將始終成對。

來源:

[<Hello> World]! 

輸出:

結果字符串

[{0}]! 

在陣列提取的參數

​​

只考慮外分隔符。裏面的任何東西都應該是參數。

+0

所以基本上一個'String.Format'的參考工程師? – AustinWBryan

+0

你可以考慮使用'string.Split'結合起來最後一個char:'World] - > World'。 'string.Split'可能需要多個分隔符。 – Ian

+0

@AustinWBryan一種。我需要分開存儲它們。 – Joshua

回答

3

您可以嘗試使用正則表達式來解析匹配集合<>[]。然後你使用regex replacecustom MatchEvaluator

像這樣的東西可能會奏效:

var regex = new Regex(@"(?<=\<).*(?=\>)|(?<=\[).*(?=\])"); 
var input = "<Hello> [World]!"; 
var index = 0; 
var replacements = new List<string>(); 
var formatString = regex.Replace(input, (m) => 
{ 
    replacements.Add(m.Value); 
    return String.Format("{{{0}}}", index++); 
}); 

我還沒有真正涉及包含<>[]輸入字符串,但是你可以彌補和逃逸模式,對付它。原始正則表達式基於this answer

編輯:Here's a .NET Fiddle for it...

+0

我做了一個簡單的測試並按預期工作,謝謝! =) – Joshua

+0

只是一句話。我使用'@「(?<=\<).*?(?=\>)|(?<= \ [)。*?(?= \])」'代替'@「(?<=\<).*(?=\>)|(?<= \ [)。*(?= \])「'因爲原來的一個是貪婪的。 '[你好] [世界]'將變成'[{0}]'。添加'?'會使其懶惰並導致'[{0}] [{1}]''。 – Joshua