모두 제거하는 정규식 (숫자가 아닌 OR 마침표)


93

"joe ($ 3,004.50)"와 같은 텍스트를 3004.50으로 필터링해야하지만 정규식에서 끔찍하고 적절한 솔루션을 찾을 수 없습니다. 따라서 숫자와 마침표 만 유지되어야하며 나머지는 모두 필터링됩니다. C # 및 VS.net 2008 프레임 워크 3.5를 사용합니다.

답변:


167

이렇게해야합니다.

string s = "joe ($3,004.50)";
s = Regex.Replace(s, "[^0-9.]", "");

1
어때 joe.smith ($3,004.50)? 단순히 문제가되는 문자 클래스를 제거하는 것은 매우 잘못 될 수 있습니다.
마태 복음 건

2
한 가지 작은 수정을합니다. Regex.Replace(s, "[^$0-9.]", "");달러 기호를 남기고 싶습니다.
bodacydo

35

정규식은 다음과 같습니다.

[^0-9.]

정규식을 캐시 할 수 있습니다.

Regex not_num_period = new Regex("[^0-9.]")

그런 다음 다음을 사용하십시오.

string result = not_num_period.Replace("joe ($3,004.50)", "");

그러나 일부 문화권에는 3.004,50과 같이 화폐 금액을 쓰는 데 다른 규칙이 있음을 명심해야합니다.


확인하기에는 너무 게으른 ATM이 있지만. ?
Andrew Anderson

9
@Andrew : 아니요, 캐릭터 클래스 내부 .에는 특별한 의미가 없습니다.
Bart Kiers 2010-06-16

2

허용되는 답변에 대해 MatthewGunn은 전체 문자열의 모든 숫자, 쉼표 및 마침표가 함께 압축된다는 점에서 유효한 지점을 올립니다. 이렇게하면 다음을 방지 할 수 있습니다.

string s = "joe.smith ($3,004.50)";
Regex r = new Regex(@"(?:^|[^w.,])(\d[\d,.]+)(?=\W|$)/)");
Match m = r.match(s);
string v = null;
if (m.Success) {
  v = m.Groups[1].Value;
  v = Regex.Replace(v, ",", "");
}

위의 정규식에는 추가 괄호가 있습니다. 를 사용 (?:^|[^w.,])(\d[\d,.]+)(?=\W|$)하면 "joe.smith25 ($ 3,004.50)"문자열의 "h25"와도 일치합니다.
Rivka

1

문제가되는 문자를 제거하는 방법은 잠재적으로 문제가 있습니다. 또 있다면 어떨까요.어딘가에 문자열에 어떨까요? 제거되지는 않습니다.

숫자가 아니거나 마침표를 제거하면 문자열 joe.smith ($3,004.50)이 구문 분석 할 수없는 .3004.50.

임호 씨, 특정 패턴을 매칭하여 그룹을 이용하여 추출하는 것이 좋습니다. 간단한 것은 regexp를 사용하여 연속 된 쉼표, 숫자 및 마침표를 모두 찾는 것입니다.

[\d,\.]+

샘플 테스트 실행 :

Pattern understood as:
[\d,\.]+
Enter string to check if matches pattern
>  a2.3 fjdfadfj34  34j3424  2,300 adsfa    
Group 0 match: "2.3"
Group 0 match: "34"
Group 0 match: "34"
Group 0 match: "3424"
Group 0 match: "2,300"

그런 다음 각 일치에 대해 모든 쉼표를 제거하고 파서로 보냅니다. 다음과 같은 경우를 처리하려면 12.323.344일치하는 하위 문자열에 최대 하나가 있는지 확인하기 위해 또 다른 검사를 수행 할 수 .있습니다.


이 정규식은 모든 것과 일치합니다.
mindriot

이제 "".
mindriot

1
제안하는 개념에는 읽고 디버그하기 어려운 복잡한 정규식이 필요합니다. 여러 정규식 및 조건문을 사용하여 단계로 나누는 것이 더 나을 수 있습니다. 나는 C #을 알고하지 않는 한 루비로 작성하지만 나는 (답변을 제공 할 수 있습니다.
mindriot

@mindriot 포인트 촬영. 더 투명한 것으로 변경했습니다.
마태 복음 건

파서로 전송하면 Single.Parse()또는 Single.TryParse?
mindriot

1

문자열을 다루고 있습니다. 문자열은 IEumerable<char>이므로 LINQ를 사용할 수 있습니다.

var input = "joe ($3,004.50)";
var result = String.Join("", input.Where(c => Char.IsDigit(c) || c == '.'));

Console.WriteLine(result);   // 3004.50
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.