2010-07-07 4 views
8

"AAA 101 B202 C 303"과 같은 문자열이 있는데 문자가 있으면 char와 number 사이의 공백을 제거하고 싶습니다. 작동 후 문자열은 "AAA101 B202 C303"과 같아야합니다. 하지만 정규식이 이것을 할 수 있는지 확실하지 않습니다?C#의 패턴 매칭 문제

어떤 도움이 필요합니까? 미리 감사드립니다.

답변

8

예, 정규 표현식으로이 작업을 수행 할 수 있습니다.

using System; 
using System.Text.RegularExpressions; 

class Test 
{ 
    static void Main() 
    { 
     string text = "A 101 B202 C 303 "; 
     string output = Regex.Replace(text, @"(\p{L}) (\d)", @"$1$2"); 
     Console.WriteLine(output); // Prints A101 B202 C303 
    } 
} 

(.이 많이 할 거라면, 당신이 잘 패턴에 대한 정규 표현식을 컴파일 할 수 있습니다)

\p{L} 일치하는 모든 유니 코드 문자 : 다음은 짧지 만 완전한 예제 - 더 제한적일 수 있습니다.

1

당신은

([A-Z]+)\s?(\d+) 

처럼 뭔가를 그리고 표현가 강화 될 수

$1$2 

로 교체하지만, 위의 예 입력 문자열 작업을해야 할 수 있습니다.

글자 (첫 번째 괄호 세트), 선택적 공백 (\ s?) 및 숫자 그룹 (\ d +)을 포함하는 그룹을 선언하는 것입니다. 그룹을 인덱스로 참조하여 대체 할 수 있으므로 공간을 없애려면 $ 1 $ 2로 바꾸십시오.

+1

왜 공간을 선택하게? 결국, 그것이 바로 이것입니다. –

0

동안 간결하지 정규식,이 매우 간단하고 매우 빠르게 실행처럼 무언가에 대한 C# 코드로 :

StringBuilder sb = new StringBuilder(); 
for(int i=0; i<s.Length; i++) 
{ 
    // exclude spaces preceeded by a letter and succeeded by a number 
    if(!(s[i] == ' ' 
     && i-1 >= 0 && IsLetter(s[i-1]) 
     && i+1 < s.Length && IsNumber(s[i+1]))) 
    { 
     sb.Append(s[i]); 
    } 
} 
return sb.ToString(); 
0

그냥 재미를 위해 (프로그래밍의 행위이기 때문에/때로는 재미 있어야한다) : O) 나는 AggregateLINQ을 사용하고 있습니다 :

var result = text.Aggregate(
string.Empty, 
(acc, c) => char.IsLetter(acc.LastOrDefault()) && Char.IsDigit(c) ? 
acc + c.ToString() : acc + (char.IsWhiteSpace(c) && char.IsLetter(acc.LastOrDefault()) ? 
string.Empty : c.ToString())).TrimEnd();