我正在尝试匹配这些有效的网址:
/match/<searchterm>
/match/<searchterm>/page/<number>
<searchterm>
是可能包含空格和&
的字词。它不应该以尾随空格字符结尾。
一些有效的例子:
/match/Hello
/match/Hello There
/match/Hello There & Bye
/match/Hello & Good Bye
/match/Hello There Lots of & words here
/match/Hello/page/1
/match/Hello There/page/10
/match/Hello There & Bye/page/33
......等等
这些是无效的例子:
/match/Hello!
/match/Hello *
/match/Hello/page
/match/Hello /page/1
/match/Hello There /page/1
我已经尝试了几个正则表达式,这个似乎很接近(according to Rubular):
\/match\/([[\w]+[\s&]*]+)(\/page\/(\d+))*
但它确实很成功地匹配:
/match/Hello ! There /page/1
此外,当我在我的sinatra应用程序中尝试这个时,Rubular正则表达式甚至根本不起作用:
get %r{\/match\/([[\w]+[\s&]*]+)(\/page\/(\d+))*} do
puts 'Matched'
end
即 当Rubular说不会这样做时,Sinatra将无法找到这个网址:
/match/Hello & There/page/1
这个问题适当的正则表达式是什么?为什么Rubular中的正则表达式有效,而Sinatra却没有(如示例所示)?
编辑:我认为网址中的空格解释了为什么Sinatra不匹配有效的正则表达式。给Sinatra的网址回来了:
/match/Hello%20&%20There
这些空格实际上不是空格。
编辑2: Avinash Raj的正则表达式工作正常,但我必须将\s
替换为%20
,因为网址中存在空格问题。
新问题:将\s
替换为%20
有效的解决方案吗?或者是否有适当的方式让Sinatra处理网址中的空格?我在文档中没有看到任何关于它的信息: