2011-04-08 1 views
0

내가 할 수 있지만 내 솔루션은 너무 해킹 조금 보인다 그래서 내가 더 우아한 솔루션을 얻으려면 물어볼 것. 정규화 된 파일 이름 목록을 가져 와서 경로 이름의 하위 문자열을 기반으로 몇 가지 버킷으로 정렬/복사해야합니다.정규화 된 파일 이름 질문을 사용하는 버킷 정렬 - 실제로 구문 분석 질문

나는 3 개의 버킷을 가지고 있으며, 아마도 더 많이 바뀔 수 있습니다. "foo", "foo \ bar"및 "foo \ baz"와 같이이 파일들을 복사 할 버킷이 3 개 있다고 가정 해보십시오. 그래서 C : \ mumble \ foo \ bar \ thing.extension 파일은 foo \ bar 버킷으로 들어가고 C : \ fumble \ foo \ baz \ this \는 다른 \ directory \ bling.extension이 \ foo \ baz 버킷, D : \ stumble \ foo \ something.extension은 foo 버킷에 저장됩니다. 나는 IndexOf를 사용하여 파일을 리디렉션해야하므로 (복사 방향을 만들 수 있음), \ foo와 foo \ bar가 비슷하고 다른 버킷이 필요하기 때문에 실제로 제대로 작동하지 않습니다. 그렇다면 나는 file.Contains를 사용할 수 있다고 생각했지만, \ foo와 \ foo \ baz는 서로 다른 버킷에 들어가서 foo \ bar를 하나씩, \ foo를 다른 것에 할당해야한다.

비교적 간단한 방법으로 아이디어를 얻는 방법이 있습니까? 내 코드가 창피합니다.

감사 Doug

+0

정규 표현식이 도움이되지 않습니까? greedy 한정 기호를 사용하여 일치 항목을 얻을 수 있습니다. – WorldIsRound

답변

0

다음과 비슷한 시도해보십시오.

private static readonly Regex _foo = new Regex(@"\\foo\\(?! (bar|baz)\\)", 
     RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace); 

    private static readonly Regex _foobar = new Regex(@"\\foo\\bar\\", 
     RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace); 

    private static readonly Regex _foobaz = new Regex(@"\\foo\\baz\\", 
     RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace); 

은 ...

 foreach (var filename in files) 
     { 
      if (_foo.IsMatch(filename)) 
      { 
       // bucket foo 
      } 
      else if (_foobar.IsMatch(filename)) 
      { 
       // bucket foobar 
      } 
      else if (_foobaz.IsMatch(filename)) 
      { 
       // bucket foobaz 
      } 
     } 

... 또는

는 _foo에 부정적 예측을 꺼내 바로 그것 if 문의 마지막 상태를 확인하십시오.

+0

이 정렬 방식은 언제든지 변경할 수 있기 때문에 정규식을 사용하기로했지만 하드 코드 대신 설정 파일에 조건을 삽입하기로했습니다. 고마워, 내가 정규식 생각하지만 파일에서 그것을 읽는 고려하지 않았다. – ddm