Dictionary<string, string> enumerator 里的数据是key="default.html" value="default.aspx"
key="about.html" value="default.aspx?name=about&id=2"
key="about_(\d+).html" value="default.aspx?name=about&id=$1"通常使用正则的做法是根据key值default.html得到value值default.aspx
根据key值about.html得到value值default.aspx?name=about&id=2
根据key值about_4.html得到value值default.aspx?name=about&id=4
...我想反过来
根据value值default.aspx得到key值default.html
根据value值default.aspx?name=about&id=2得到key值about.html
根据value值default.aspx?name=about&id=4得到key值about_4.html
...应该怎么做,求救!不知道我有没有说清楚,如果能给出正确答案者再增加50分
key="about.html" value="default.aspx?name=about&id=2"
key="about_(\d+).html" value="default.aspx?name=about&id=$1"通常使用正则的做法是根据key值default.html得到value值default.aspx
根据key值about.html得到value值default.aspx?name=about&id=2
根据key值about_4.html得到value值default.aspx?name=about&id=4
...我想反过来
根据value值default.aspx得到key值default.html
根据value值default.aspx?name=about&id=2得到key值about.html
根据value值default.aspx?name=about&id=4得到key值about_4.html
...应该怎么做,求救!不知道我有没有说清楚,如果能给出正确答案者再增加50分
System.Collections.ArrayList di=new System.Collections.ArrayList();
di.Add("default.aspx");
di.Add("default.aspx?name=about&id=2");
di.Add("default.aspx?name=about&id=7");
di.Add("default.aspx?name=about&id=8");
System.Text.RegularExpressions.Regex re=new System.Text.RegularExpressions.Regex(@"name=([^&]*)&id=(\d)*");
for (int i = 0;i<di.Count; i++)
{
string strv=di[i].ToString();
System.Text.RegularExpressions.Match ma=re.Match(strv);
if(ma.Success)
{
if(ma.Groups[2].Value=="2")
{
Response.Write(di[i]+"的原型为"+ma.Groups[1].Value+".html<BR>");
}
else
{
Response.Write(di[i] + "的原型为" + ma.Groups[1].Value + "_" + ma.Groups[2].Value + ".html<BR>");
}
}
else
{
Response.Write(di[i] + "的原型为default.aspx<BR>");
}
}default.aspx的原型为default.aspx
default.aspx?name=about&id=2的原型为about.html
default.aspx?name=about&id=7的原型为about_7.html
default.aspx?name=about&id=8的原型为about_8.html
原来是输入 default.html 定向到 default.aspx
about.html 定向到 default.aspx?name=about&id=2
about_3.html 定向到 default.aspx?name=about&id=3
Dictionary <string, string> enumerator 里的数据改为
key="default.aspx" value="default.html"
key="default.aspx?name=about&id=2" value="about.html"
key="default.aspx?name=about&id=(\d+)" value="about_$1.html" 就可以输入 default.aspx --> default.html
……
key="about.html" value="default.aspx?name=about&id=2"
key="about_(\d+).html" value="default.aspx?name=about&id=$1"
key="test_(\d+).html" value="default.aspx?name=test&id=$1"
key="news_(\d+)_(\d+).html" value="default.aspx?name=news&id=$1&class=$2"
key="bbs_(\d+)_(\d+)_(\w+).html" value="default.aspx?name=bbs&id=$1&class=$2&bbs=$3"
现在想再增加一个功能,在页面里面根据默认的url地址转到URL重写文件里的地址。例如<a href="$url("default.aspx")$">test1</a>
<a href="$url("default.aspx?name=about&id=2")$">test2</a>
<a href="$url("default.aspx?name=test&id=3")$">test3</a>
<a href="$url("default.aspx?name=bbs&id=100&class=2&bbs=test1")$">test4</a>不想写成死的,如,这也不是我想要的
<a href="default.html">test1</a>实际打开页面的时候地址变成<a href="default.html">test1</a>
<a href="about.html">test2</a>
<a href="about_3.html">test3</a>
<a href="bbs_100_2_test1.html">test3</a>
把原来的key,value交换存储
test("default.aspx?name=bbs&id=12&class=ret&bbs=abc"); private string test(string strValue)
{
Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Add("default.html", "default.aspx");
dic.Add("about.html", "default.aspx?name=about&id=2");
dic.Add("about_(\\d+).html", "default.aspx?name=about&id=$1");
dic.Add("test_(\\d+).html", "default.aspx?name=test&id=$1");
dic.Add("news_(\\d+)_(\\d+).html", "default.aspx?name=news&id=$1&class=$2");
dic.Add("bbs_(\\d+)_(\\d+)_(\\w+).html", "default.aspx?name=bbs&id=$1&class=$2&bbs=$3");
string str;
string tmp = Regex.Replace(strValue, "(?<=\\=).+?(?=&|$)", "", RegexOptions.IgnoreCase);
MatchCollection mcValues = Regex.Matches(strValue, "(?<=\\=).+?(?=&|$)", RegexOptions.IgnoreCase);
MatchCollection mc;
MatchCollection mcKeys;
string result = "";
foreach (KeyValuePair<string, string> kvp in dic)
{
str = Regex.Replace(kvp.Value, "(?<=\\=).+?(?=&|$)", "", RegexOptions.IgnoreCase);
if (tmp.CompareTo(str) == 0)
{
int keyIndex = 0;
int keyIndexOffset = 0;
bool isOk = true;
result = kvp.Key;
mcKeys = Regex.Matches(kvp.Key, "\\(.+?\\)", RegexOptions.IgnoreCase);
mc = Regex.Matches(kvp.Value, "(?<=\\=).+?(?=&|$)", RegexOptions.IgnoreCase);
for (int i = 0; i < mc.Count; i++)
{
if (mc[i].Value.StartsWith("$") && mcKeys.Count > keyIndex)
{
result = result.Insert(mcKeys[keyIndex].Index + keyIndexOffset, mcValues[i].Value);
if (!Regex.IsMatch(mcValues[i].Value, mcKeys[keyIndex].Value, RegexOptions.IgnoreCase))
{
isOk = false;
break;
}
keyIndexOffset += mcValues[i].Value.Length;
keyIndex++;
}
else if (mcValues[i].Value.CompareTo(mc[i].Value) != 0)
{
isOk = false;
break;
}
}
if (isOk)
{
result = Regex.Replace(result, "\\(.+?\\)", "", RegexOptions.IgnoreCase);
return result;
}
}
}
return "";
}