2012-04-03 35 views
2

我有一個包含[]多次的路徑+文件名。 我想要做的是把[]圍繞各個[像這樣:C#正則表達式[將[[]和]更改爲[]]

E:\測試\香蕉[關在籠子裏當[大象] laugh.png

替換成

E:\測試\香蕉[[]在一個籠子裏[]]時,[[]大象[] laugh.png

這樣做的原因是在這裏:

DataRow[] tempRows = filenames.Select("File like '" + tempLogElement + "'"); 

如果出現包含方括號的路徑,將會崩潰。這是因爲[]用於在這種'like'語句中轉義*和%。避免這個問題的辦法是逃避轉義字符....

我不是真棒在正則表達式,但我已經得到aprox的位置:

Regex.Replace(tempLogElement, "(\[*\])", "[]]", RegexOptions.IgnoreCase); 

這隻逃脫]字符,但不人物。

這是行不通的:

tempLogElement.Replace("[","[[]").Replace("]","[]]") 

第二替代會搞亂了第一個替換。所以我想我不得不在一次操作中使用它。首先想到的是Regex。

+0

將在輸入字符串中括號始終處於配對?或者輸入字符串是否有'['沒有對應的']'? – 2012-04-03 01:42:13

+0

可能沒有相應的...這是一個文件名,所以它將能夠包含任何組合。 – 2012-04-03 02:14:20

回答

1

嘗試

Regex.Replace(tempLogElement, "\[([\w\s]*)\]", "[[]$1[]]", RegexOptions.IgnoreCase); 
+0

嗨,@ rikitikitik,你的正則表達式不匹配第一個字符串'[在籠子裏]',應該改變:'\ [([\ w \ s] *)\]' – zhengchun 2012-04-03 01:48:27

+0

哦對。編輯。 – rikitikitik 2012-04-03 01:50:48

+0

更短,更甜。正是我在找的東西。 – 2012-04-03 02:06:57

0

爲什麼不使用String.Select

tempLogElement.Select(o => o == '[' ? "[[]" : (o == ']' ? "[[]" : o.ToString())); 

或使用for iterartion

string temp = tempLogElement, replaced = ""; 
for (int i = 0; i < temp.Length; i++) 
{ 
    if (temp[i] == '[') replaced += "[[]"; 
    else if (temp[i] == ']') replaced += "[[]"; 
    else replaced += temp[i]; 
} 
+2

嗯...你的第二個替換,將取代第一個項目! – 2012-04-03 01:30:57

+0

這將導致第一個替換中新插入的右方括號替換爲第二個。 – rikitikitik 2012-04-03 01:31:27

+0

第二個替換會搞砸了。所以我想我不得不在一次操作中使用它。首先想到的是Regex。 – 2012-04-03 01:33:48

1
Regex _formatReplaceRegex = new Regex(@"\[([^\]]*)\]",RegexOptions.IgnoreCase); 

string input = @"E:\Test\Bananas[in a cage]when[elephants]laugh.png"; 
Console.WriteLine(_formatReplaceRegex.Replace(input,"[[[$1]]]"); 

--update更換使用$ 1而不是匿名方法.--

+0

改變它,所以它爲我工作: 正則表達式fixString = new正則表達式(@「\ [([^ \]] *)\]」,RegexOptions.IgnoreCase); string test = fixString.Replace(tempLogElement,m =>「[[]」+(m.Groups [1] .Value)+「[]]」); DataRow [] tempRows = filenames.Select(「File like'」+ test +「'」); – 2012-04-03 01:47:59

4

這裏有一個短例如:

Regex.Replace(input, @"\[|\]", "[$0]") 

這符合任一[][ ... ]包含原始字符替換。

3

正則表達式少

tempLogElement.Replace("[", "[[").Replace("]", "[]]").Replace("[[", "[[]"); 
+0

這是一個聰明的!我會盡力記住它:) – 2012-04-03 02:02:12

相關問題