2012-04-03 3 views
2

[]을 (를) 포함하는 경로 + 파일 이름이 여러 번 있습니다. 내가 원하는 무엇 그래서 같이 각 주위에 [] 넣어 :C# [[]로] []로 변경하는 Regex

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

윌 괄호는 항상 일치하는 쌍으로 수? 아니면 입력 문자열에'[''와'']'가있을 수 있습니까? –

+0

해당 없음 ...이 파일 이름 일 수 있으므로 모든 조합을 포함 할 수 있습니다. –

답변

1

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

안녕하세요, @ rikitikitik, 당신의 정규식은 첫 번째 문자열'[새장]'과 일치하지 않아야합니다 :'\ [([\ w \ s] *) \]' – zhengchun

+0

아 맞아. 편집 중. – rikitikitik

+0

더 짧고 더 달콤합니다. 내가 찾고 있었던 것. –

0

String.Select을 사용하지 않으시겠습니까?

+2

음 ... 두 번째 대체, 첫 번째 항목을 대체 할 것입니다! –

+0

이렇게하면 첫 번째 교체에서 새로 삽입 된 오른쪽 대괄호가 두 번째 대체로 대체됩니다. – rikitikitik

+0

두 번째 대체는 모든 것을 망칠 것입니다. 그래서 나는 한 번의 작업으로 그것을 한 무언가를 사용해야 만한다는 것을 알았습니다. 그리고 마음에 처음 나온 것은 Regex였습니다. –

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]]]"); 

사용을 $ 대신 1의 익명 메소드를 .- 교체 --update 사용은 여기에 짧은이다 예 :

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

[ 또는 하나 ]과 일치 [ ... ] 원래 문자를 포함하는으로 대체합니다. 입력 문자열에서

+0

그것을 변경 : 정규식 fixString = 새 정규 표현식 (@ "\ [([^ \]] *) \]"RegexOptions.IgnoreCase); string test = fixString.Replace (tempLogElement, m => "[[]"+ (m.Groups [1] .Value) + "[]]"); DataRow [] tempRows = 파일 이름. 선택 ("File like '"+ test + "'"); –

4

을 시도

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]; 
} 
3

정규식없는

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

그건 영리한거야! 나는 그것을 기억하려고 노력할 것이다 :) –