如何打印/显示斜杠之间正则表达式的一部分?
irb> re = /\Ahello\z/
irb> puts "re is /#{re}/"
结果是:
re is /(?-mix:\Ahello\z)/
我想要:
re is /\Ahello\z/
......但不要做这种疯狂:
puts "re is /#{re.to_s.gsub( /.*:(.*)\)/, '\1' )}/"
答案 0 :(得分:3)
使用.inspect
代替.to_s
:
> puts "re is #{re.inspect}"
re is /\Ahello\z/
答案 1 :(得分:3)
如果要查看分隔符之间的原始模式,请使用source
:
IP_PATTERN = /(?:\d{1,3}\.){3}\d{1,3}/
IP_PATTERN # => /(?:\d{1,3}\.){3}\d{1,3}/
IP_PATTERN.inspect # => "/(?:\\d{1,3}\\.){3}\\d{1,3}/"
IP_PATTERN.to_s # => "(?-mix:(?:\\d{1,3}\\.){3}\\d{1,3})"
这是source
显示的内容:
IP_PATTERN.source # => "(?:\\d{1,3}\\.){3}\\d{1,3}"
Returns the original string of the pattern. /ab+c/ix.source #=> "ab+c" Note that escape sequences are retained as is. /\x20\+/.source #=> "\\x20\\+"
注:
从小图案构建复杂图案很常见,并且使用插值来插入简单图案很有吸引力,但这并不像大多数人认为的那样有效。考虑一下:
foo = /foo/
bar = /bar/imx
foo_bar = /#{ foo }_#{ bar }/
foo_bar # => /(?-mix:foo)_(?mix:bar)/
请注意,foo_bar
具有每个子模式的模式标志。如果你不知道它们存在的话,那些可以真的弄乱你的东西。在(?-...)
块内部,与外部模式相关的模式可以具有与i
,m
或x
完全不同的设置。调试可以让你疯狂,比试图调试复杂模式更糟糕。我怎么知道这个?我是那场特殊战争的老手。
这就是source
很重要的原因。它注入了精确的模式,没有标志:
foo_bar = /#{ foo.source}_#{ bar.source}/
foo_bar # => /foo_bar/