2010-12-13 4 views
11

나는 사용자가 사진에 댓글을 달 수있는 웹 사이트가 있습니다. 물론 은, 사용자가 같은 코멘트를 남겨 :문자열에서 반복되는 문자를 제거하는 방법

'OMGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG을 !!!!!!!!!!!!!!!'

또는

는 '당신은 SUCCCCCCCCCCCCCCCCCKKKKKKKKKKKKKKKKKK'

당신은 그것을 얻을.

기본적으로 나는 이러한 초과 반복 문자의 대부분을 제거하여 이러한 주석을 줄이려고합니다. Regex..i로 할 수있는 방법이 있습니다. 알아낼 수 없습니다.

아이디어가 있으십니까?

+5

나는이 저자가 의도하지 않은 뭔가 주석의 언어학을 변경 ...이 좋은 해결책이라고 생각하지 않습니다. 기본적으로 그들은 멍청이를 의도했고 당신은 그것을 횡설수설로 바꿀 것입니다. 예를 들어 누군가 "booooo!"라고 말하면 그걸 "보"로 바꿀거야? 숫자는? 사용자 이름? URL? – tenfour

+4

당신은 반복되는 쓰레기에서 시작하는 것이 더 쉬울 것입니다. 배가 된 쓰레기는 영어로 쓰여집니다. – Piskvor

+1

잘 작성된 바보 스팸은 여전히 ​​바보 스팸이며, 한 눈에 파악하기가 약간 더 어렵습니다. –

답변

9

키핑은 종종 당신은 아마 맹목적으로 그들을 제거하지 않습니다. 여기에 이중을 넘어서는 것을 제거 할 수있는 정규식이 있습니다.

Regex r = new Regex("(.)(?<=\\1\\1\\1)", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant | RegexOptions.Compiled); 

var x = r.Replace("YOU SUCCCCCCCCCCCCCCCCCKKKKKKKKKKKKKKKKKK", String.Empty); 
// x = "YOU SUCCKK" 

var y = r.Replace("OMGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG!!!!!!!!!!!!!!!", String.Empty); 
// y = "OMGG!!" 
+0

러시아어는 때로는 세 글자를 사용합니다 (드물게 다양 함). – AgentFire

+0

흥미 롭다. 나는 그것을 몰랐다. 정규 표현식을 두 배로 늘리거나 세 배로 늘리고 적절히 행동 할 것으로 예상되는 문자 집합에 대해 알기 쉽게 표현하는 것이 좋습니다. –

8

특히 코드의 문자열을 줄이거 나 유효성 검사에 실패하여 양식을 사용자에게 다시 표시하는 것으로 충분합니까? "반복되는 문자가 너무 많습니다."

후자가 허용되는 경우 @"(\w)\1{2}"은 3 자 이상의 문자와 일치해야합니다 (두 번 이상 반복됨).

편집 : @Piskvor 지적으로,이 정확히 3 자에 일치합니다. 그것은 일치를 위해 잘 작동하지만 교체가 아닙니다. 그의 버전 @"(\w)\1{2,}"은 교체하기에 더 잘 작동합니다. 그러나, 나는 여기서 교체가 가장 좋은 방법이 아닐 것이라고 지적하고 싶다. 폼이 유효성 검사에 실패하는 것보다 제출 된 텍스트를 제거하는 것이 좋을 것입니다. 왜냐하면 달리 말로 읽을 수없는 텍스트를 말도 안하는 텍스트로 바꾸는 경우가있을 것이기 때문입니다.

+1

'(\ w) \ 1 {2,}'라고 말하고 싶습니다. '(\ w) \ 1 {2}'는 정확하게 3 문자와 일치합니다. – Piskvor

+0

@Piskvor : 확실합니까? 나는 어떤 의미로 정규식 전문가가 아니지만, 그냥 "abbbbbbbcdef"에 대해 광산을 테스트했는데 일치했다. (.NET에서 적어도 비표준 동작을 나타내지 만 문제가되는 환경 일 수도 있습니다.) – David

+0

아, 그러면 모든 것이 올바르게 일치 할 것입니다. (정확히 3 번 반복 된 하위 문자열이 있습니다.) 전체 복제본과 일치하지 않습니다. 굵은 글씨체 인 "a ** bbb ** bbbbcdef"와 일치합니다. 매치 *를하고 *를 대체하는 것이 전혀 편리하지 않습니다. – Piskvor

0

편집 : 끔찍한 제안, 내가 진정으로 가치가 읽기하지 마십시오 내 -1 : 난 당신이 찾고있는 같은 technical nuggets 뭔가 여기

.

내가 반복에 대한 정규식 기호에 대해 들어 본 적이 있기 때문에 매우 긴 정규식 제외하고는 아무 상관이 없습니다

...

그것은 전체 예제, 내가 여기에 붙여 넣기하지 않습니다하지만 난이 뜻을 생각한다 당신의 질문에 완전히 대답하십시오.

+1

아아, 끔찍해. Äääääääśśśśööööööö, 이것은 블랙리스트 된 문자들만을 막을 것입니다. 유니 코드가 널리 지원 되었기 때문에 완전히 유용하지는 않습니다. 정규식 역 참조에 대해 읽어보십시오. 비록 지금까지는 들어 본 적이 없지만 존재합니다. – Piskvor

+0

@Piskvor : 예, 나는 그들을 찾으려고 노력하고 있습니다. 그러나 설명 된 어딘가를 찾을 수는 없습니다. 사실, @ "(\ w) \ 1 {2}"에서는 \ 1이 무엇을 의미하는지 이해하지 못합니다. 만약 당신이 링크가 설명되어 있다면 그것은 나를 위해 매우 유용 할 것입니다 :) – LaGrandMere

+0

@LaGrandMere : 나는 링크가 없지만'\ 1'은 기본적으로 정규 표현식의 첫 번째 그룹을 뒤돌아 본다는 것을 의미합니다 (첫 번째 세트 괄호는'(\ w)'이다. – David

0

Distinct()는 모든 중복을 제거하지만 "A"와 "a"는 동일하게 보이지 않습니다.

Console.WriteLine(new string("Asdfasdf".Distinct().ToArray())); 

출력 "Asdfa는"

0
var test = "OMMMMMGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGMMM"; 

test.Distinct().Select(c => c.ToString()).ToList() 
     .ForEach(c => 
      { 
       while (test.Contains(c + c)) 
       test = test.Replace(c + c, c); 
      } 
     ); 
2

정규식은 잔인한 것이다. 이 시도 : 영어 이중 문자를 사용을 염두에

public static string RemoveRepeatedChars(String input, int maxRepeat) 
    { 
     if(input.Length==0)return input; 

     StringBuilder b = new StringBuilder; 
     Char[] chars = input.ToCharArray(); 
     Char lastChar = chars[0]; 
     int repeat = 0; 
     for(int i=1;i<input.Length;i++){ 
      if(chars[i]==lastChar && ++repeat<maxRepeat) 
      { 
       b.Append(chars[i]); 
      } 
      else 
      { 
       b.Append(chars[i]); 
       repeat=0; 
       lastChar = chars[i]; 
      } 
     } 
     return b.ToString(); 
    } 
1
var nonRepeatedChars = myString.ToCharArray().Distinct().Where(c => !char.IsWhiteSpace(c) || !myString.Contains(c)).ToString(); 
관련 문제