2012-12-20 3 views
0

나는 C#에서 다음을 가지고있다.파일 경로에서 동적 사용자 이름 제거

string fileName = @"X:\Users\username\AppData\Local\foo.txt"; 

나는 다음을 되 찾을 수 있도록 Regex.Replace을 수행하려고합니다.

string fileName = @"X:\Users\AppData\Local\foo.txt"; 

드라이브 문자 (X:) 동적 될 수 있습니다 정규식을 사용하는 것이 좋을 것이다. 본질적으로 'username'부분 만 삭제하면됩니다. 또한 사용자 이름은 사용자의 실제 이름에 대한 자리 표시 자일뿐입니다. 따라서 bob 또는 larry 또는 john 또는 기타 항목이 될 수 있습니다. 정규식은 이것을 고려해야합니다.

여기에 계산 항상 X:\Users\로 시작하는 것입니다 수있는 것 (여기서 X : C: 또는 D: 등을 할 수 있음) \ 다음에 할 것이다 다음 다음 몇 가지 문자열을 따라야 할 것입니다 및 중요하지 않은 다른 경로 요소. 또한 users or Users에 대소 문자를 구분하지 않는 것이 좋습니다.

나는 이것이 Regex 없이도 가능하다는 것을 알고 있지만, 나는 이것을 Regex 만 지원하는 더 큰 시스템에 맞추기 위해 이것을 필요로한다. String.Replace 또는 String.Join과 같은 것은 지원되지 않습니다.

당신은이 샘플을 시도 할 수 있습니다
+2

두 번째 항목을 배열 ('\')로 제거하고 완료합니다. – sajanyamaha

+0

정규 표현식을 사용하는 것보다 훨씬 더 ... –

+2

'fileName = fileName.Replace (@ "\ username", "");'그렇게 하겠지만 정규 표현식을 사용해야하는 이유는 무엇입니까? – Habib

답변

0

:

string fileName = @"X:\Users\username\AppData\Local\foo.txt"; 
Console.Write(Regex.Replace(fileName, @"([A-Z]{1}\:*\\Users\\)(\w+\\)(.*)", "$1$3")); 

설명 :

  1. ([A-Z]{1}\:\\[Uu]sers\\) - 정규식이 부분 경로에서 username 전에 문자의 첫 번째 그룹이다
    • ^은 줄의 시작을 의미합니다 (파일 이름 앞의 단어를 무시하기 위해 이것을 제거하십시오)
    • [A-Z]{1}\:\\은 디스크 루트 경로를 나타냅니다. 여기서 원하는 디스크 문자를 선택할 수 있습니다 (예 : [CDX-Z]{1}). 참고 {1} - 제약 조건이므로 대문자가 1 개만 필요합니다. 정규식의이 부분은 두 번째 그룹 -
    • [Uu]sers\\
    • 이는 대체 패턴으로 $1으로 대해 참조 첫 번째 그룹은
    • (\w+\\)
  2. 되는 경우를 구분 사용자 경로 에 대한 그룹주의, 사용자 디렉토리의 이름을 나타냅니다 경로의 문자는 username,의
    • \w+\\는 적어도 하나 개의 단어 문자와 \ 기호를 의미합니다. 경로에서 username 후 정규식이 부분은 문자의 세 번째 그룹은 임의의 문자
      • .* 스탠드 - 이것은 대체 패턴
    • (.*) 아닌 제 2 그룹 인 제거한 후 \ 기호.

업데이트 : 현실 세계에서 나는 공백, 유니 코드 문자와 ~와 사용자 이름을 발견했다. 그래서 나는 문자를 포함하기 위해 2. 그룹을 대체했지만 \ 표지판을 포함시켰다.

string fileName = @"X:\Users\username\AppData\Local\foo.txt"; 
Console.Write(Regex.Replace(fileName, @"([A-Z]{1}\:\\[Uu]sers\\)([^\\]*\\)(.*)", "$1$3")); 
+0

감사합니다. –

+0

파일 이름 앞에 나오는 단어를 무시하도록 어떻게 조정할 수 있습니까? 문자열 파일 이름 = @ ""이 파일 X : \ Users \ username \ foo.txt는 텍스트입니다. " "이 파일"을 무시하고 싶습니다. 단지 예제 일뿐입니다. 감사! –

+0

@Raymond Parsons 답변을 – VMAtm