为什么在 `#` 之后的正则表达式模式中不允许使用 `/`?

Why is `/` not allowed in regex pattern after `#`?

x 选项可用于格式化正则表达式以使其更具可读性并引入注释。所以我尝试了:

my_pattern = / #dummy pattern to match everything
  .*  #/ <-- offending character
  /x

我得到一个错误:

main.rb:2: syntax error, unexpected tIDENTIFIER, expecting ')' (SyntaxError)

这是什么意思?我以为 # 之后的所有内容都被忽略了。

简答

Ruby 译员看到

my_pattern = /whatever/ <-- offending character
/x

这不是有效的 Ruby 代码。

注释没有特殊的地方,如果你想在正则表达式模式中的任何地方使用文字 /,你需要转义 \/ 它们。

my_pattern = / .* #\/ <-- offending character /x

另一种方法,正如 Uri Agassi 所建议的,是使用 %r{} 形式使用 / 包装正则表达式的替代方法:

pattern = %r{ .* #/ <-- offending character }x

那么你要注意文字 }.

详细解释

尝试输入交互式 Ruby shell (irb):

irb(main):001:0> my_pattern = / #dummy_pattern to match everything

Ruby 如预期的那样等待更多代码。

irb(main):002:0/ .*  #/ <-- offending character
SyntaxError: (irb):2: syntax error, unexpected tIDENTIFIER, expecting keyword_do or '{' or '('
    from /usr/bin/irb:11:in `<main>'

程序崩溃。

注意,程序甚至没有到达 /x 行,所以 Ruby 不知道 # 用于注释 .它匹配 / - 正则表达式模式的结尾(文字 #s 作为正则表达式的一部分)然后找到

 <-- offending character

什么是无效的 Ruby 代码。

Ruby 解释器从 .rb 文件或 irb.

中读取相同内容

如果您需要在评论中包含 /,请在 ruby 解释器的第一遍转义它,即

irb(main):003:0> my_pattern = / #dummy_patter to match everything
irb(main):004:0/ .*  #\/ <-- offending character
irb(main):005:0/ /x
=> / #dummy_patter to match everything
.*  #\/ <-- offending character
/x

按预期工作并匹配所有内容(当然除了新行):

irb(main):006:0> my_pattern.match("match me!")
=> #<MatchData "match me!">