2010-11-26 8 views
9

.Net 응용 프로그램을 작성 중이며 문자열에서 소수가 아닌 문자를 제거해야합니다 (첫 번째 '.'제외). 기본적으로 실수 결과를 강제로 사용자 입력을 청소하고 있습니다.REGEX로 문자의 첫 번째 문자를 제외한 모든 문자를 찾으십시오.

지금까지 온라인 RegEx 도구를 사용하여 한 번에이 작업을 수행했지만 아직 멀지 않았습니다.

나는이 작업을 수행 할 :

asd123.asd123.123.123 = 123.123123123 

불행하게도 나는 단지이 코드를 사용하여 단계

asd123.asd123.123.123 = 123.123.123.123 

에 도착하기 위해 관리했습니다.

System.Text.RegularExpressions.Regex.Replace(str, "[^\.|\d]*", "") 

그러나 첫 번째 소수점 이외의 모든 부분을 제거하려고 시도했습니다.

한 번에이 작업을 수행 할 수 있습니까?
더 나은 방법 ™이 있습니까?

+0

's/[.]/\ x {DEADBEEF} /; s/[^. \ d \ x {DEADBEEF}] // g; s/\ x {DEADBEEF} /./;' – tchrist

답변

6

이 적어도 .NET에서 단일 정규식 할 수 어설 입력 문자열의 시작 부분에서 시작하는 문자열을 일치시키는 것은 불가능하며 점 이외의 문자. 이 조건은 첫 번째 점 뒤에 오는 모든 점에 해당됩니다.

+1

감사합니다.이 예제는 내가 정규식에 대해 결코 알지 못했던 것을 가르쳐주었습니다. – Mike

+0

고마워, 나는 새로운 것을 너무 배웠다! lookbehind 어설 션에 대한 링크를 읽을 때까지 예제를 이해할 수 없었습니다!이것은 나를 도왔습니다! –

0

첫째, 현재 사용중인 정규 표현식은 | 문자 그대로.

Replace(str, "([\d]+\.[\d]+)[^\d].*", "\1"); 

그러나에 전혀 .가있는 경우에만이 필요한 것 : .이 후 []

에서 특별한 의미가 없기 때문에 당신은 당신이 이런 식으로 뭔가를 시도 할 수, 대체 [^.\d]* 필요 번호.

희망이 도움이됩니다.

+0

첫번째 부분을 고쳐 주셔서 고마워요. http://regexpal.com/에 따르면 두 번째 정규식은 123.123.123.123에 모두 일치하므로 원하는 효과가 있습니까? 전에 "\ 1"을 보지 못했습니다. – Mike

+0

흠, 두 번째 정규식이 모두 일치해야합니다. 그 다음 .NET이 다른 정규식 시스템을 사용하지 않는 한 \ 1 (첫 번째 하위 패턴 인'()'부분)을 123.123으로 바꾸십시오. 사용! –

2

정규 표현식 없이는 더 잘 수행 될 것입니다.

resultString = Regex.Replace(subjectString, @"(?<!^[^.]*)\.|[^\d.]", ""); 

을 설명 :

(?<!^[^.]*) # Either match (as long as there is at least one dot before it) 
\.   # a dot 
|   # or 
[^\d.]  # any characters except digits or dots. 

(?<!^[^.]*) 수단 : lookbehind assertions 내부 무한 반복을 지원

string str = "asd123.asd123.123.123"; 
StringBuilder sb = new StringBuilder(); 
bool dotFound = false; 
foreach (var character in str) 
{ 
    if (Char.IsDigit(character)) 
     sb.Append(character); 
    else if (character == '.') 
     if (!dotFound) 
     { 
      dotFound = true; 
      sb.Append(character); 
     } 
} 
Console.WriteLine(sb.ToString()); 
+0

고맙습니다.이 답변에 감사드립니다. 이런 종류의 논리를 시도하기까지 내 마음을 넘어서지 못했습니다. 나는 2 개의 답을 받아 들일 수 있었으면 좋겠다. – Mike

관련 문제