命名组+ x修饰符

时间:2015-04-15 14:34:22

标签: ruby regex

如何将命名组与x正则表达式修饰符结合使用?

使用:

/(?<number>\d+)/ =~ 'hello here is a number 3298472398723'
puts number

使用:

regexp = /
  number  # this is a word
  \s      # this is a space
  (\d+)   # this is a bunch of numbers
/x
regexp =~ 'hello here is a number 3298472398723'
puts $1

不能工作:

regexp = /
  number  # this is a word
  \s      # this is a space
  (?<number>\d+)   # this is a bunch of numbers
/x
regexp =~ 'hello here is a number 3298472398723'
puts number

我做错了什么?

1 个答案:

答案 0 :(得分:4)

你正在混淆。后一个例子中的puts number不起作用,不是因为它是扩展的正则表达式,而是因为它不是内联的。

$~[:number]Regexp.last_match[:number]始终有效。

直接引用仅适用于内联regexp:

▶ /
▷   number  # this is a word
▷   \s      # this is a space
▷   (?<number>\d+)   # this is a bunch of numbers
▷ /x =~ 'hello here is a number 11111'
#⇒ 16
▶ number
#⇒ "11111"

这里它非常适用于扩展的正则表达式,因为它是内联的。

UPD 感谢@Stefan,documentation提出了更精确的要求:

  

此分配在Ruby解析器中实现。解析器检测到regexp-literal =~ expression的分配。正则表达式必须是没有插值的文字,并放在左侧。