ruby正则表达式选项`n`有什么影响?

时间:2018-03-27 21:40:39

标签: ruby regex

我在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

2 个答案:

答案 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

因此,它必须忽略所有多字节字符序列并将所有内容视为原始字节。