为什么在 `#` 之后的正则表达式模式中不允许使用 `/`?
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!">
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!">