如何打印Ruby正则表达式变量?

时间:2014-07-24 22:41:34

标签: ruby regex

如何打印/显示斜杠之间正则表达式的一部分?

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' )}/"

2 个答案:

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

来自the documentation

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具有每个子模式的模式标志。如果你不知道它们存在的话,那些可以真的弄乱你的东西。在(?-...)块内部,与外部模式相关的模式可以具有与imx完全不同的设置。调试可以让你疯狂,比试图调试复杂模式更糟糕。我怎么知道这个?我是那场特殊战争的老手。

这就是source很重要的原因。它注入了精确的模式,没有标志:

foo_bar = /#{ foo.source}_#{ bar.source}/
foo_bar # => /foo_bar/