C#에서 페이지 번호 문자열 구문 분석: 종합 가이드

소프트웨어 애플리케이션을 작업할 때, 특히 인쇄 또는 페이지 나누기된 콘텐츠가 포함된 애플리케이션에서 사용자 입력으로부터 페이지 번호를 구문 분석해야 할 필요성을 만날 수 있습니다. 일반적인 입력 형식은 “1,3,5-10,12"와 같이 쉼표 및 대시로 구분된 페이지 번호의 조합일 수 있습니다. 이 문자열을 개별 페이지 번호 목록으로 변환하려면 도전이 발생합니다. 많은 개발자는 이를 자동으로 처리하고 싶어하며, 처음부터 맞춤형 솔루션을 만들기보다는 이러한 자동화된 처리 방법을 선호합니다.

문제: 페이지 번호 문자열 구문 분석

이제 여러분은 다음과 같은 질문을 하실 수 있습니다: C#에는 페이지 번호 문자열을 구문 분석하기 위한 내장 지원이 있나요? 답변은 C#에는 이 특정 작업을 위한 전용 내장 함수는 없지만, 효율적인 솔루션을 만드는 데 필요한 도구를 제공한다는 것입니다. 전체 목표는 페이지 번호 문자열을 가져와서 이러한 개별 숫자의 완전한 목록을 출력하는 것입니다. 대시로 표시된 범위를 확장하여 “5-10"이 “5,6,7,8,9,10"으로 변환되어야 합니다.

해결책: 사용자 정의 구문 분석기 구현

단계별 분석

목표를 달성하기 위해 문자열 조작과 C# 컬렉션을 조합하여 사용할 수 있습니다. 아래의 개요는 이 프로세스를 설명합니다:

  1. 문자열 분할: 입력 문자열을 쉼표마다 분할하여 개별 구성요소로 세분화합니다. 각 구성요소는 단일 숫자 또는 숫자 범위일 수 있습니다.
  2. 숫자 구문 분석: int.TryParse()를 사용하여 세그먼트가 단일 정수인지 확인합니다.
  3. 범위 처리: 세그먼트에 대시가 포함되면(예: “5-10”), 세그먼트를 추가로 분할하여 시작 및 종료 숫자를 추출합니다. 시작 숫자가 종료 숫자보다 작거나 같은지 검증합니다.
  4. 범위 생성: Enumerable.Range() 메서드를 사용하여 지정된 범위 내의 모든 정수 값을 생성합니다.
  5. 결과 제공: 마지막으로 모든 구문 분석된 숫자를 호출자로 반환합니다.

예제 코드

다음은 위의 논리를 C#로 캡슐화한 샘플 구현입니다:

foreach (string s in "1,3,5-10,12".Split(',')) 
{
    // 개별 페이지 번호를 구문 분석하려고 시도
    int num;
    if (int.TryParse(s, out num)) 
    {
        yield return num; // 단일 숫자를 반환
        continue; // 다음 반복으로 건너뜀
    }

    // 그렇지 않으면 범위 처리
    string[] subs = s.Split('-');
    int start, end;

    // 범위의 시작 및 끝 구문 분석
    if (subs.Length > 1 &&
        int.TryParse(subs[0], out start) &&
        int.TryParse(subs[1], out end) && 
        end >= start) 
    {
        // 시작부터 끝까지 숫자 범위 생성
        int rangeLength = end - start + 1;
        foreach (int i in Enumerable.Range(start, rangeLength)) 
        {
            yield return i; // 범위 내 각 숫자를 반환
        }
    }
}

코드 설명

  • 입력 분할: .Split(',') 메서드를 사용하여 입력 문자열을 관리 가능한 조각으로 나눕니다.
  • 숫자 구문 분석: int.TryParse()를 사용하여 문자열 세그먼트를 정수로 안전하게 변환할 수 있는지를 확인합니다.
  • 범위 처리: 대시를 포함한 세그먼트에 대해 유효성을 검사하고 시작 및 끝 지점을 추출하기 위해 분할합니다.
  • 값 제공: yield 문은 메서드가 값을 한 번에 하나씩 반환할 수 있게 하여 구문 분석기 호출 시 더 효율적입니다.

결론

C#에서 페이지 번호 문자열을 구문 분석하는 것은 처음에는 까다롭게 보일 수 있지만, 올바른 접근 방식을 통해 간단하고 효율적으로 만들 수 있습니다. 문자열 조작과 기본 C# 구조를 활용하면, 바퀴를 다시 만들지 않고도 다양한 입력 형식을 처리할 수 있습니다. 이 방법은 필요할 경우 더욱 복잡한 사례에 맞게 쉽게 확장하고 조정할 수 있게 해줍니다.

요약하자면, 내장 기능을 찾기보다는 요구 사항을 충족하는 사용자 정의 함수를 자신 있게 만들 수 있으며, 이를 통해 코드가 더 깔끔해지고 개발 프로세스가 원활해집니다.

이 접근 방식을 프로젝트에 적용하고 아래 댓글에서 여러분의 경험을 공유해 주세요!