2013-01-21 25 views
3

我期待採取的URL看起來像:簡單的regex表達 - 如何重新塑造一個URL

http://www.example.com/activated-alumina-desiccant/t101c5.aspx 

,並更改爲這樣:

http://www.example.com/Default.aspx?t=101&c=5 

我也想了靈活地添加其他查詢字符串變量,如:

http://www.example.com/activated-alumina-desiccant/t101c5p232.aspx 

這將讓我:

http://www.example.com/Default.aspx?t=101&c=5&p=232 

到目前爲止,我有什麼,我需要的開端,[^/]+$

這我得到URL的最後一部分,但除此之外,我怎麼打破的最後一位和獨立伊諾查詢字符串變量?我很難過!

這裏是正則表達式會: enter image description here

+0

爲什麼要使用正則表達式?這是一個嚴格的限制嗎? – Oded

+0

我必須使用RegEx,因爲這是針對web.config中的重寫規則 – box86rowh

+0

@ box86rowh它可以是_several_正則表達式,還是隻有一個? – Rawling

回答

3

此正則表達式將分裂出一個URL最多3個查詢字符串變量:

([^/]+//+[^/]+/)[^/]+/(\w)?(\d+)?(\w)?(\d+)?(\w)?(\d+)?\.aspx

用這個替代字符串:

"$1Default.aspx?$2=$3&$4=$5&$6=$7"

編輯:

如果尾隨&=,例如,http://www.example.com/Default.aspx?t=101&=&=,不會引起一個問題,你可以逃脫一個正則表達式,設定爲預期的查詢字符串變量的最大數量轉換。這個最大值受到正則表達式引擎在替換字符串中允許多少個捕獲組限制(9個捕獲組給出了絕對最大值4,99給出了絕對最大值49)。

如果尾隨&=您需要輸入一個正則表達式爲每一個不同數量預計查詢字符串變量的問題。考慮到這一點,正則表達式必須稍微修改(2-查詢字符串爲例):

正則表達式:([^/]+//+[^/]+/)[^/]+/(\w)(\d+)(\w)(\d+)\.aspx
更換:"$1Default.aspx?$2=$3&$4=$5"

+1

我懷疑有一個更好的辦法比三變量查詢,兩個變量類似,另一個爲四,等等... – Rawling

+0

當我回到辦公桌時,我會給這個鏡頭。 – box86rowh

+0

@Rawling - 你可能是對的。看到我更新的答案。 – robinCTS

0

注:初級C#代碼。

Ideone Demo

string s="t101c5p2"; 
    string[]arr= Regex.Split(s,"(?<=[0-9])(?=[a-zA-Z])"); 
    foreach(String str in arr) 
    { 
    string replaceStr = new Regex("([a-z])([0-9])").Replace(str,"$1=$2"); 
    Console.WriteLine(replaceStr); 
    } 

輸出:

t=101 
c=5 
p=2 
+0

請求幫助將其轉換爲C#並完成答案而不是向下投票。 – Srinivas

+1

已解決的幫助請求:對正則表達式部分使用['Regex.Matches'](http://msdn.microsoft.com/zh-cn/library/system.text.regularexpressions.regex.matches.aspx),[ foreach'](http://msdn.microsoft.com/en-us/library/ttw7t8t6(VS.80).aspx)循環結果 – Default

+0

完成。所做的更改。 – Srinivas

0
string url = "http://www.example.com/activated-alumina/t101c5p232.aspx"; 
var segment = new Uri(url).Segments.Last(); 
var parameters = 
     String.Join("&", Regex.Matches(segment, @"([a-zA-Z]+)(\d+)") 
          .OfType<Match>() 
          .Select(m => m.Groups[1] + "=" + m.Groups[2])); 

string result = "http://www.example.com/Default.aspx?" + parameters; 
// http://www.example.com/Default.aspx?t=101&c=5&p=232 

DEMO