2011-03-14 4 views
2
여기

샘플 문자열처럼 '/ AAA/BBB/CCC/DDD'또는 '/ AAA/ZZZ'
AAA
BBB
CCC
처럼 나는 각 블록을 얻을 수있는 정규식을 얻고 싶은
, DDD는
'/ aaa/bbb/ccc/ddd'와 같은 문자열을 구문 분석하는 방법은 무엇입니까?

따라서, 나는

Regex r = new Regex(@"(/[^/]*)*"); 

을 썼다 그러나 그것은 단지
는 /DDD
어떻게 모든 사람, 엄마를 얻을 수 있습니다, 마지막 경기를 얻을 수 있습니다 고마워.

업데이트 내 질문 : 나는 재미를 위해서 '나누기'를 알고 있습니다.

string s = @"ftp://127.0.0.1/TE ST.中文 空格CC/T # ES T.OK/# ##中文 测试##^#@!aaa.txt"; 

내가 /.../ 사이의 각 블록을 인코딩 할 (사용 Uri.EscapeDataString (각)) 내가 Regex.Replace를 사용하는 것을 선호 , 그것은 가능하다 : 상황은 내가 문자열이 무엇입니까?

답변

1

귀하의 첫 질문은 :

Regex r = new Regex(@"(/[^/]*)"); 
var matches = r.Matches("/aaa/bbb/ccc/ddd"); 

foreach (var match in matches) 
{ 
    // ... 
} 

은 단순히 패턴의 후행 *를 제거했습니다.

두 번째 질문 : 모든 사람을위한

Regex r = new Regex(@"/([^/]*)"); 
var result = r.Replace("1.1.1.1/aaa/bbb/ccc/test.ext", match => { 
    return string.Format("/{0}", Uri.EscapeDataString(match.Groups[1].Value)); 
}); 
+0

괜찮아요. 'ftp://1.1.1.1/aaa/bbb/ccc/test.ext'와 같은 문자열이 있는데, 'aaa'=> Uri.EscapeDataString ('aaa')와 'bbb ','ccc ','test.ext '같은 일을 어떻게해야합니까? – nonocast

+0

새로운 답변 코드가 새 코드로 업데이트되었습니다. – gnab

9

이렇게 간단하게 정규 표현식을 사용할 필요는 없습니다.

string s = "/aaa/bbb/ccc/ddd"; 
var blocks = s.Split('/'); 
foreach(var block in blocks) { 
    Console.WriteLine(block); 
} 

출력 :

aaa 
bbb 
ccc 
ddd 

편집 : 아, 난 당신이 뭘 하려는지를 참조하십시오. 이제는 빈 항목을 제거하지 않으려 고합니다.

string encoded = String.Join("/", blocks.Select(b => Uri.EscapeDataString(b))); 
+0

'분할': – nonocast

+0

는 Uri.EscapeDataString (각 블록) – nonocast

+0

@nonocast에 의해 Regex.Replace 각 블록을 시도해보십시오 내 편집을 참조하십시오. – jason

5

이 경우 /에서 분리하지 않는 이유는 무엇입니까?

String[] split = "/aaa/bbb/ccc/ddd".split("/"); 

(나는 C#을 쓴 이후 위의 하나 또는 두 개의 오류를 포함 할 수 있도록 노트, 그것은 그러나 아이디어가 명확해야, 잠시되었습니다.)

+0

String [] split = "/aaa/bbb/ccc/ddd".Split('/ '); 그 모든 변화가 끝나야합니다! – Venki

0

당신은 아마 일치를 호출 방법이 필요하고 이 (가)과 일치합니다. 그러나 split 메소드를 사용하여 "/"(올바르게 사용하는 경우)로 분할 할 수도 있습니다.

public void Replace(string input) 
{ 
    Regex r = new Regex(@"(/[^/]*)"); 
    var matchEval = new MatchEvaluator(Encode); 
    r.Replace(input, matchEval); 
} 

public string Encode(Match m) 
{ 
    //TODO: Encode the match 
} 

참고 :

교체하려면 나는 이것을 실행하지 않은하지만 방법론은 소리를해야합니다. Regex 사용

1

덕분에, 오늘 아침을 썼다.

string s = @"ftp://127.0.0.1/# #/中 文.NET/###_%TRY 字符.txt"; 

s = ftpUrlPattern.Replace(s, new MatchEvaluator((match) => { 
    return "/" + Uri.EscapeDataString(match.Groups["tag"].Value); 
})); 

이 같은 패턴 :.

내가 아는
static Regex ftpUrlPattern = new Regex(@"(?<!/)/(?<tag>[^/]+)"); 
관련 문제