2012-12-11 4 views
0

정규식을 사용하여 영수증에서 각 광고 항목의 데이터를 가져옵니다.정규식을 사용하여 영수증에서 데이터 가져 오기

Qty Desc 
1 JD *# 
    MARTINI *# 
2 XXXXXX 
3 YYYYYY 
4 JD 
    PEPSI *# 

모든 항목이 수량과 설명을 가지고 있고, 그들 중 일부는 추가 *# 있습니다 영수증은 다음과 같이 할 것입니다. 또한 설명에는 공백이 포함될 수 있으며, 및 두 줄 이상이 포함될 수 있습니다. 각 줄에는 자체적으로*#이있을 수 있습니다. 수량과 설명을 알아 내고 싶습니다 (두 줄 이상인 경우 모든 줄을 가져옵니다). *#에 대해서는 전혀 신경 쓰지 않습니다. 이 예에서 첫 번째 광고 항목의 경우 Quantity = 1 및 Description = "JD MARTINI"를 찾습니다. 네 번째의 경우 Quantity = 4이고 Description = "JD PEPSI"입니다. 그것은 작동하지 않습니다

((\d+)\s+(.*)(\s+\*#)?) 

, 나는 마지막 괄호는 선택하게하는 것은 욕심 (.*) 절대적으로 모든 것을 잡을 수 있기 때문에 가정 :

나의 현재 정규 표현식은 다음과 같습니다. 마지막 괄호가 선택 사항이 아닌 경우 일반 표현식은 *#이있는 광고 항목에 대해 작업을 수행하지만 첫 번째 및 3 번째 광고 항목과 일치하지 않습니다 (추가 *#이 없기 때문에).

아이디어가 있으십니까?

+0

설명이 모두 텍스트인지 또는 공백이 있습니까? –

+0

@Ann L - 잘 했어, 그냥 물어 보려구 :-) – theMayer

+0

regexlib.com, BTW에서 정규식 테스트 장치를 사용해 볼 수 있습니다. 나는 그것이 매우 도움이된다는 것을 알았다. –

답변

1

수정 된 질문을 읽은 후, 나는 결정했다 당신이 하나의 정규 표현식을 수행 할 수 없습니다 달성 할 것. 당신은 regex match + replace의 조합을해야 할 것입니다.

정규식을 교체 (\ D +) \ (S) + ([AZ \ S * 번호] * [AZ] +) :

대전 정규식 (Regular expression to skip character in capture group이 질문 참조) (* #을 (\ s에 *)) (? = \ s)

일치 정규식은 줄 바꿈 또는 * 항목을 포함하여 수량 및 항목 설명과 일치하며 최종 *를 생략합니다. 설명의 마지막 문자가 문자라고 가정합니다.

일치하는 정규식을 실행 한 후에는 일치하는 배열을 가져 오게됩니다.이 반복을 통해 반복적으로 개체로 변환해야합니다. 나는 당신을 위해 그것을 할 수있는 편리한 코드를 작성했다. 각 객체에 대해 객체의 설명에서 대체 정규 표현식을 실행하면 관련없는 공백이 제거되고 * #.

 class ReceiptItem 
    { 
     public int Quantity { get; set; } 
     public string Description { get; set; } 

     public override string ToString() 
     { 
      return string.Format("{0}\t{1}", Quantity, Description); 
     } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     var matches = Regex.Matches(textBox1.Text, @"(\d+)\s+([A-Z\s\*\#]*[A-Z]+)", RegexOptions.Multiline); 
     var items = (from Match m in matches 
        select new ReceiptItem() 
           { 
            Quantity = int.Parse(m.Groups[1].Value), 
            Description = Regex.Replace(m.Groups[2].Value, @"(\*\#(\s*))|(\r\n\s+)(?=\s)", "") 
           }); 

     listBox1.Items.AddRange(items.ToArray()); 
    } 
+0

그것은 내가 원하는 것을 정확하게하지는 못하지만, 내가 성취하고자하는 것에 대해 더 잘 설명해주지 않으면 내 잘못입니다. 편집 된 질문을 살펴보십시오. – Antrim

+0

수정 된 답변을 참조하십시오. 문제는 해결되었습니다 (희망). – theMayer

+0

위대한 직업과 완벽하게 설명했다. 감사! – Antrim

0

은 (Multiline 옵션)이 정규 표현식을 시도해보십시오

(\d+)\s+(?:(.*)(?:\s+\*#)|([^#]*))$ 
+0

Regex Coach를 사용하고 있기 때문에 그럴 수도 있습니다. 그러나 그것은 아무것도 일치하지 않습니다. – Antrim

+0

이 페이지에서 사용해 보았습니다. http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx – manji

+0

Regex Coach와 일치합니다. 여러 줄 상자를 확인 했습니까? – manji

0

나는 그것이 당신이 필요로하는 것을한다고 생각합니다.

((\d+)\s+(.+?)(\s+\*#)*) 
+0

각 광고 항목 설명의 첫 번째 문자 만 가져옵니다. – Antrim

관련 문제