[c#] 모두 제거하는 정규식 (숫자가 아닌 OR 마침표)
“joe ($ 3,004.50)”와 같은 텍스트를 3004.50으로 필터링해야하지만 정규식에서 끔찍하고 적절한 솔루션을 찾을 수 없습니다. 따라서 숫자와 마침표 만 유지되어야하며 나머지는 모두 필터링됩니다. C # 및 VS.net 2008 프레임 워크 3.5를 사용합니다.
답변
이렇게해야합니다.
string s = "joe ($3,004.50)";
s = Regex.Replace(s, "[^0-9.]", "");
답변
정규식은 다음과 같습니다.
[^0-9.]
정규식을 캐시 할 수 있습니다.
Regex not_num_period = new Regex("[^0-9.]")
그런 다음 다음을 사용하십시오.
string result = not_num_period.Replace("joe ($3,004.50)", "");
그러나 일부 문화권에는 3.004,50과 같이 화폐 금액을 쓰는 데 다른 규칙이 있음을 명심해야합니다.
답변
허용되는 답변에 대해 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, ",", "");
}
답변
문제가되는 문자를 제거하는 방법은 잠재적으로 문제가 있습니다. 또 있다면 어떨까요.
어딘가에 문자열에 어떨까요? 제거되지는 않습니다.
숫자가 아니거나 마침표를 제거하면 문자열 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
일치하는 하위 문자열에 최대 하나가 있는지 확인하기 위해 또 다른 검사를 수행 할 수 .
있습니다.
답변
문자열을 다루고 있습니다. 문자열은 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