2010-08-10 5 views
0

C#에서 정규 표현식을 사용하여 쿼리 문자열을 변환하려고합니다.정규 표현식으로 URL 재 작성

나는 여러 가지 정의 된 쿼리 문자열 매개 변수 (즉, A, B 및 C)를 가지고 있습니다.

나는이

page.aspx?A=XXX&B=YYY&C=1 

에 같은 것을 변환하고자 : A와 B에 대한 첫 번째 두 개의 매개 변수 값이 단순히 연결된 것을

page/XXX/YYYY/true 

참고하지만, 일부 난 데 문제 와 함께 C=1true 출력으로 변경했습니다.

이 작업을 수행 할 수도 있습니까? C=1 부분이 발견되지 않는 경우에, 나는 아무것도 출력하지 않으려 :

page.aspx?A=XXX&B=YYY 

이된다 :

page/XXX/YYY 

I는 소스 쿼리 문자열의 A의 순서와 B를 생각하지 않는다 다른 순서로, 그러나 B가 A의 앞에 오는 경우에 극복하기 위하여 무언가는 쓸 수 있 었는가?

나는 모든 종류의 것을 시도해 왔습니다. 결정적으로, 나는 이것을 할 수 있는지 알고 싶다. 그렇지 않다면, 나는 그것을 다른 방법으로해야 할 것이기 때문이다.

+2

정규식이 아닌 일반 C# 코드를 사용하는 것이 더 간단하고 명확 해집니다. –

답변

0

Robert H가 주석에 언급 한 것처럼 Regex보다 String.Replace()에서 더 나은 주행 거리를 얻을 수 있습니다. 당신이
Regex.Replace(yourString, [patern for A=], "page/");
Regex.Replace(yourString, [patern for B=], "/");
Regex.Replace(yourString, [patern for C=], "true");

를 호출하고 있도록 정말 선택에되고 싶은 경우에 나는 (당신이 정말로 필요하면) 세 가지 문으로 그들을 분할 정규식하지만, 무엇을 할 것 지금하시는 일은 먼저 각 패턴에 대해 Regex.Match()으로 전화하여 입력에 패턴이 존재하는지 확인하십시오. 그런 다음 누락 된 부분이 있으면 건너 뛸 수 있습니다.

따라서이 당신을 위해 작동합니다 : 참고 : 오류가 수행되지 확인, 사용을 "있는 그대로"자신의 위험에

string input = "A=xxx&B=yyy&C=1"; 
string input2 = "A=xxx&B=yyy"; 

if(Regex.Match(input, "A=").Success) input = Regex.Replace(input, "A=", "page/"); 
if(Regex.Match(input,@"\&B=").Success) input = Regex.Replace(input, @"\&B=", "/"); 
if(Regex.Match(input,@"\&C=1").Success) input = Regex.Replace(input, @"\&C=1", "/true"); 

if(Regex.Match(input2, "A=").Success) input2 = Regex.Replace(input2, "A=", "page/"); 
if(Regex.Match(input2,@"\&B=").Success) input2 = Regex.Replace(input2, @"\&B=", "/"); 
if(Regex.Match(input2,@"\&C=1").Success) input2 = Regex.Replace(input2, @"\&C=1", "/true"); 

Console.WriteLine(input); //Output = page/xxx/yyy/true 
Console.WriteLine(input2); //Output = page/xxx/yyy 
+0

아주 흥미 롭습니다. JMarsch에 대한 답장에서 말했듯이,이 파일들을 설정 파일에 넣기를 바랬습니다. 이것은 가능한 일을하는 것처럼 보입니다. 내 자신의 위험 부담으로 작업하겠습니다.) – Shane

1

당신은 정규 표현식을 사용하지 않는 더 좋을 수 있습니다.
이 시도 :

 

      string urlString = "page.aspx?A=XXX&B=YYY&C=1"; 
      var builder = new System.UriBuilder(urlString); 
      // the first character in Query will be a "?" 
      string[] queries = builder.Query.Substring(1).Split('&'); 
 

을이 시점에서 각 쿼리 항목이 자신의 문자열로 분리해야합니다. 배열의 각 요소 (예 : queryies [0] .StartsWith())에 내장 된 문자열 메서드를 사용하여 어떤 문자열이 "C"쿼리 문자열인지 식별하고 필요한대로 경로를 빌드 할 수 있습니다.

+0

JMarsch! 답변 해 주셔서 감사합니다. 나는 이것이 내가 추락 할 것이라고 생각했다.나는 그 파일을 설정 파일에 넣고 C# 구성 요소에 대체 'generic'을 만들 수 있기 때문에 작업을 수행하는 단일 정규 표현식을 만들 수 있는지 궁금했을 것입니다. 도움 주셔서 감사합니다. – Shane