3

我正在尝试为 Rails 测试做一个断言,该测试测试方法重定向到某个 URL,但是对于我的断言,该 URL 只是部分完整,因为我不完全确定完整路径是什么。因此,我正在尝试为部分路径编写断言。这就是我所拥有的,但我对正则表达式不是很好。

assert_match /[#{PAYPAL_CONFIG["url"]}]./, @response.redirect_url

我希望它与贝宝路径相匹配,然后是之后发生的任何事情,但我不知道如何做到这一点。当我使用此正则表达式进行匹配时,我在测试中遇到错误empty range in char class: /[https:\/\/www.sandbox.paypal.com\/cgi-bin\/webscr?]./我知道我的正则表达式是错误的,我试图匹配 paypal url 之后的任何内容。有人可以帮帮我吗?

我可以看到 [] 括号充当一个或我想要的是指定的路径以及之后的任何内容。

我已将我的断言更改为:

/#{PAYPAL_CONFIG["url"]}.*/

我的测试通过了,但我收到了这个警告:WARNING: MiniTest::MINI_DIR was removed. Don't violate other's internals.我的正则表达式是否正常?谢谢

4

1 回答 1

2

在将其放入正则表达式之前,您应该转义该 url。

就像是

/#{Regexp.escape(PAYPAL_CONFIG["url"])}/ 

可能会更好。

WRT你的例子,问题出cgi-bin在位。正则表达式引擎需要一个连字符来表示一个字符i-b范围,这不是一个合法的范围,因为在 i 之上和 b 之下都没有字符。

没有方括号的版本有效的原因是正则表达式引擎仅将连字符解释为括号内的一系列字符,但正则表达式本身仍然会被弄乱。

>> foo = "https:\/\/www.sandbox.paypal.com\/cgi-bin\/webscr?"
=> "https://www.sandbox.paypal.com/cgi-bin/webscr?"
>> /[#{foo}]/
RegexpError: empty range in char class: /[https:\/\/www.sandbox.paypal.com\/cgi-bin\/webscr?]/
from (irb):2
>> /[#{Regexp.escape(foo)}]/
=> /[https:\/\/www\.sandbox\.paypal\.com\/cgi\-bin\/webscr\?]/
>> Regexp.escape(foo)
=> "https://www\\.sandbox\\.paypal\\.com/cgi\\-bin/webscr\\?"
>> foo
=> "https://www.sandbox.paypal.com/cgi-bin/webscr?"
于 2012-11-23T18:31:33.167 回答