2013-12-20 2 views
2

RegEx 일치를 사용하여 주어진 문자열에서 값을 추출하는 데 문제가 있습니다. 작업중인 문자열이 아래에 나와 있습니다.간단한 C# 정규식 일치 문제

X 1,981mm

533, 35mm 두꺼운 - 비 화재 문 : £ 33.14

내가 가진 정규식 문자열

533 X 1,981mm을 다음과 같다 경우 잘 작동하는 것입니다, 35mm 두께 : £ 33.14

^(?<first>\d+)\s*x\s*(?<second>\d+)mm,\s*(?<third>\d+)mm Thick: £(?<price>\d+\.\d+)$ 

내 질문에 내가 다시를 변경하는 방법입니다 gEx는 마지막 'mm'과 '£'기호를 무시합니다.

내 코드에서 밀리미터 단위로 측정 한 값을 인치로 변환하고 문자열을 내 메서드로 반환합니다. 나머지 코드는 다음과 같습니다.

var first = Int32.Parse(match.Groups["first"].Value); 
var second = Int32.Parse(match.Groups["second"].Value); 
var third = Int32.Parse(match.Groups["third"].Value); 
var price = Decimal.Parse(match.Groups["price"].Value, CultureInfo.InvariantCulture); 

감사합니다.

+1

어쩌면 내가 당신의 질문을 이해하지 않지만 shuldn't '^ (? \ D +) \ S * X \ * mm (d 개 + \? ), \는 *의의 (? \ D +) mm * * (? \ d + \. \ d +) $'트릭을합니까? –

+0

는 내가 볼 수있는 한 멀리 작동해야하지만 * 위험합니다. 욕심이 일치 할 수 있습니다. 만약 당신이 단지 하나의 금액을 보길 기대한다면 : 일치하는 mm 다음 전체 문자열에서 £ 00.00 다음 괜찮아요. 실제로 그 문자열의 끝에 일치하는 편집 실제로 다음 예, 걱정하지 마십시오 작동해야합니다 –

답변

3

mm Thick: £mm.*?£으로 바꿉니다.

.*?

+0

이 경우 지연된 연산자'?'는 필요하지 않습니다. 문자열'$ '의 끝은 마지막 문자열 양. regex 엔진은 종종 역 추적 할 필요가 없기 때문에 게으른 일치를 얻는 것이 좋습니다 : [link] (http://www.regular-expressions.info/repeat.html) –

+0

당신이 옳습니다 (다른 의견과 함께) 출력에 영향을 미치지 않습니다. 그러나 나는 이것이 보통 "오직 하나의''''사례에서보다 효율적일 것으로 기대했을 것입니다 - 그것은 파운드 기호를 만날 때까지 포착하여 모든 것을 포착하기보다는 가격에 맞추기 위해 즉시 움직일 것입니다. 문자열의 마지막에'£'을 매치하고,'£'를 다시 찾을 때까지 욕심쟁이 일치에서 문자를 역 추적합니다. – Rawling

+0

정규식 엔진이 일반적으로 작동하는 방식을 올바르게 읽은 경우 아니오. 테스트 문자열 (게으른 매치)에서 모든 문자에 대해 게으른 반복 연산자'.? '를 사용하면 앞으로 검사하여 일치하지 않는 문자가 있는지 확인한 다음 테스트 문자 뒤의 문자로 역 추적하지 않고 반복합니다. 설명대로 작동 시키려면 @MarkO –

1

사용 [^£]+을하지 않습니다되는 1 개 이상의 문자를 얻기 위해 "(?) 가능한 몇 번으로 제로 (*)를 포함한 모든 문자 (.) 여러 번 일치"를 의미 £.

^(?<first>\d+)\s*x\s*(?<second>\d+)mm,\s*(?<third>\d+)mm[^£]+£(?<price>\d+\.\d+)$