我在ruby source code中读到这一行:
m = /\AHTTP(?:\/(\d+\.\d+))?\s+(\d\d\d)(?:\s+(.*))?\z/in.match(str) or
我没有看到docs中描述的n
选项。它有什么作用?为了正确测试,我需要一个将返回1xx响应的HTTP服务器。所以我还不能这样做。但它看起来像一个bug。 sock.readline
会返回"HTTP/1.1 200 OK\r\n"
之类的内容,但这与RE不匹配。如果选项为m
,则更有意义。我想知道这是否是一些未经测试的代码路径,有人使用n
vs m
。如果是这种情况,为什么n
不会失败?我尝试了其他随机字母,但它们都失败了。看一些简单的测试:
"HTTP/1.1 200 OK\r\n" =~ /\AHTTP(?:\/(\d+\.\d+))?\s+(\d\d\d)(?:\s+(.*))?\z/im
#=> 0
"HTTP/1.1 200 OK\r\n" =~ /\AHTTP(?:\/(\d+\.\d+))?\s+(\d\d\d)(?:\s+(.*))?\z/in
#=> nil
"HTTP/1.1 200 OK\r\n" =~ /\AHTTP(?:\/(\d+\.\d+))?\s+(\d\d\d)(?:\s+(.*))?\z/iz
#=> SyntaxError: (eval):2: unknown regexp option - z
答案 0 :(得分:4)
在文档中向下滚动一下,您会发现:/pat/n - ASCII-8BIT
这会取代当前的源编码(默认UTF-8)
答案 1 :(得分:4)
//n
表示NOENCODING
。来自Ruby测试:
def test_has_NOENCODING
assert Regexp::NOENCODING
re = //n
assert_equal Regexp::NOENCODING, re.options
end
因此,它必须忽略所有多字节字符序列并将所有内容视为原始字节。