求助一个正则的问题

caicoko 2008-07-28 05:22:04
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分
...全文
201 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
caicoko 2008-07-29
  • 打赏
  • 举报
回复
继续~
caicoko 2008-07-29
  • 打赏
  • 举报
回复
顶上~
caicoko 2008-07-29
  • 打赏
  • 举报
回复
楼上的,不是这么简单,你可以试试
AechoJohn 2008-07-29
  • 打赏
  • 举报
回复
再构造一下Dictionary <string, string>。
把原来的key,value交换存储
caicoko 2008-07-29
  • 打赏
  • 举报
回复
顶上~
caicoko 2008-07-29
  • 打赏
  • 举报
回复
求助~
caicoko 2008-07-29
  • 打赏
  • 举报
回复
非常感谢dk385,问题已经解决,再送上100分~~~
caicoko 2008-07-29
  • 打赏
  • 举报
回复
继续求助~
caicoko 2008-07-29
  • 打赏
  • 举报
回复
先谢谢楼上的,我调试过后,如果成功,我会再额外再增加分数给你
家鸣 2008-07-29
  • 打赏
  • 举报
回复
做了个Demo,好像还可以。

test("default.aspx?name=bbs&id=12&class=18&bbs=abc");
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 "";
}
caicoko 2008-07-29
  • 打赏
  • 举报
回复
回楼上的,你可以试试,没用的!
ppp7p 2008-07-29
  • 打赏
  • 举报
回复
[Quote=引用楼主 caicoko 的帖子:]
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.…
[/Quote]
你需要是根据key值得到value值,你可以遍历一次Dictionary key值加一个判断就可以得到value值
guyan033 2008-07-29
  • 打赏
  • 举报
回复
学习
caicoko 2008-07-29
  • 打赏
  • 举报
回复
顶上~
caicoko 2008-07-29
  • 打赏
  • 举报
回复
继续`
caicoko 2008-07-29
  • 打赏
  • 举报
回复
不相信没有人知道~
caicoko 2008-07-28
  • 打赏
  • 举报
回复
回 belldandy11

本来要实现的是URL重写,这部分功能已经实现了。
现在想再增加一个功能,在页面里面根据默认的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>

caicoko 2008-07-28
  • 打赏
  • 举报
回复
因为我的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="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"
belldandy11 2008-07-28
  • 打赏
  • 举报
回复
LZ要的应该是想实现URL重定向吧
原来是输入 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
……

caicoko 2008-07-28
  • 打赏
  • 举报
回复
不用正则也可以,只要能解决问题就行了。

楼上的方法不通用
加载更多回复(6)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧