日期:2014-05-19  浏览次数:20413 次

求一个正则表达式匹配四种情况
http://nt.eepw.com.cn/showtopic-4.aspx
http://nt.eepw.com.cn/showtopic-4-2.aspx#24
http://nt.eepw.com.cn/showtopic.aspx?page=end&topicid=4#24(注,end指尾页,也是一种写法)
http://nt.eepw.com.cn/showtopic.aspx?page=2&topicid=4#24


大家可以看到下面四中网址形式都是bbs的帖子页面,但是网址有所不同
网址如下
http://nt.eepw.com.cn/showtopic-4.aspx
http://nt.eepw.com.cn/showtopic-4-2.aspx#24
http://nt.eepw.com.cn/showtopic.aspx?page=end&topicid=4#24(注,end指尾页,也是一种写法)
http://nt.eepw.com.cn/showtopic.aspx?page=2&topicid=4#24


我要求不管网址采取那种方式,我都可以将他的网址的分页部分找到,并修改。
并都修改成这种形式http://nt.eepw.com.cn/showtopic-帖子编号-第几页.aspx

也就是说随便给你上面的四种网址,能帮我替换成我要求的网址
注:忽略#后面的字符
比如
http://nt.eepw.com.cn/showtopic-4.aspx
应该改成
http://nt.eepw.com.cn/showtopic-4-1.aspx(因为是第一页)
另外:还能进行替换
比如把
http://nt.eepw.com.cn/showtopic-4-1.aspx
替换成
http://nt.eepw.com.cn/showtopic-4-7.aspx(也就是变成第七页)


也就是写
funtion   goPagenum(pagenum)
{
把当前的网址中的页码替换成另一个页码的,然后进行跳转
}


------解决方案--------------------
一个正则应该很难实现,分别用四个正则匹配到帖子编号和页号,然后再转向
------解决方案--------------------
try

http://nt\.eepw\.com.cn/showtopic(-(? <topicid> \d+))?(-(? <page> \d+))?(\.aspx\?page=(? <page> \d+|end)&topicid=(? <topicid> \d+))?

所给例子四种网址中,捕获组topicid和page匹配结果分别为

4,

4,2

4,end

4,2

一个正则可以匹配,但是第一页和end需要在替换之前判断一下,其余页可以直接替换
------解决方案--------------------
http://nt\.eepw\.com\.cn/((showtopic-(? <topicid> \d+)(-(? <page> \d+))?.aspx)|(showtopic.aspx\?(&?page=(? <page> \w+)|&?topicid=(? <topicid> \d+)){2}))

http://nt.eepw.com.cn/showtopic-4.aspx
topicid=4, page=
http://nt.eepw.com.cn/showtopic-4-2.aspx#24
topicid=4, page=2
http://nt.eepw.com.cn/showtopic.aspx?page=end&topicid=4#24
topicid=4, page=end
http://nt.eepw.com.cn/showtopic.aspx?page=2&topicid=4#24
topicid=4, page=2
http://nt.eepw.com.cn/showtopic.aspx?topicid=4&page=2#24
topicid=4, page=2