교체

2012-07-23 4 views
1

은 유무 :교체

"a__b_c_____d__e_f__" 

필요 :

"a_b_c_d_e_f_" 

즉 : "_" (단일 밑줄)로 모든 "___" 문자열 (1 개 이상 밑줄) 교체 루프없이 을.

+0

숙제와 같은 소리가납니다. 재귀를 생각하십시오. –

+0

나는 정말 좋은 해결책을 모른다. 그래서 물었습니다. 어쩌면 regexp ... –

+0

가능한 중복 : [어떻게 C#에서 단일 공백으로 여러 공백을 대체합니까?] (http://stackoverflow.com/q/206717/416627) –

답변

13

정규 표현식을 사용하십시오.

var input = "a__b_c_____d__e_f__"; 
var output = Regex.Replace(input, "_+", "_"); 
+0

+1, 나는 [이 답변] (http://stackoverflow.com/a/206946/416627)과 동일한 제안 된 수정 사항을 링크하려고했습니다. –

-1

시작해야합니다.

cat file | perl -e "s/\_+/\_/g" 
+1

bash 명령입니까? C# 코드가 필요합니다. –

+8

그건 C#처럼 보이지 않습니다 ... ... –

+0

+1 .. 똑같은 정규 표현식이기 때문에 포스터가 생각을 계속할 것을 제안합니다. 아마도 코멘트 일뿐입니다. –

1

문제를 해결하는 이동하는 방법에는 여러 가지가 있습니다

string str = "a__b_c_____d__e_f__"; 
string newStr = System.Text.RegularExpressions.Regex.Replace(str, "_{2,}", "_"); 
0
var cleanString = Regex.Replace("a__b_c_____d__e_f__", "(_)+", "$1"); 
-1

를 따라 같이 RegularExpressions를 사용하여이를 달성 할 수있는,하지만 난 당신이없이 "무슨 뜻인지 좀 확실 해요

while (myString.contains("__")) 
    myString.replace("__", "_"); 
:

분명히

하면 다음과 같은 루프를 사용할 수 있습니다 ... "루프

나는 이것이 당신이 피하려고 노력한다고 말한 것 같지만 ... 어딘가에 루프를 포함하지 않는 해결책이 있다고 생각하지 않는다. .contains 메소드와 .replace 메소드는 구현시 루프를 사용합니다. 명확히하기 위해 다음 코드도 사용할 수 있습니다.

string outputStr = ""; 
bool underscore = false; 
for(int i = 0; i < myString.length; ++i) 
{ 
    if (myString[i] == '_') 
    { 
     if (underscore == false) 
      outputStr += myString[i]; 
     underscore = true; 
    }else outputStr += myString[i]; 
} 

여기서 알 수있는 것처럼 하나의 루프 만 사용합니다. 이것이 더 효율적이지만 (효율성이 문제라면 outputStr 변수에 문자열 대신 StringBuilder를 사용하는 것이 좋습니다) 요점은 문자열을 살펴볼 필요가 있다는 것입니다. 루프를 작성하는 사람이든, 아니면 자신을 대신해 다른 방법을 호출하는지 여부와 관계없이 루프를 사용하십시오.