gpt4 book ai didi

ruby - 如何在 Ruby 中的其他正则表达式中嵌入正则表达式

转载 作者:数据小太阳 更新时间:2023-10-29 06:59:01 25 4
gpt4 key购买 nike

我有一个字符串:

'A Foo'

并想在其中找到“Foo”。

我有一个正则表达式:

/foo/

我正在嵌入另一个不区分大小写的正则表达式,因此我可以逐步构建模式:

foo_regex = /foo/
pattern = /A #{ foo_regex }/i

但它不会正确匹配:

'A Foo' =~ pattern # => nil

如果我将文本直接嵌入到它起作用的模式中:

'A Foo' =~ /A foo/i # => 0

怎么了?

最佳答案

从表面上看,将一个模式嵌入另一个模式似乎很简单,但这是基于对模式在 Ruby 中的工作方式的错误假设,即它们只是字符串。使用:

foo_regex = /foo/

创建一个 Regexp 对象:

/foo/.class # => Regexp

因此它知道用于创建它的可选标志:

( /foo/    ).options # => 0
( /foo/i ).options # => 1
( /foo/x ).options # => 2
( /foo/ix ).options # => 3
( /foo/m ).options # => 4
( /foo/im ).options # => 5
( /foo/mx ).options # => 6
( /foo/imx ).options # => 7

或者,如果你喜欢二进制:

'%04b' % ( /foo/    ).options # => "0000"
'%04b' % ( /foo/i ).options # => "0001"
'%04b' % ( /foo/x ).options # => "0010"
'%04b' % ( /foo/xi ).options # => "0011"
'%04b' % ( /foo/m ).options # => "0100"
'%04b' % ( /foo/mi ).options # => "0101"
'%04b' % ( /foo/mx ).options # => "0110"
'%04b' % ( /foo/mxi ).options # => "0111"

并在使用 Regexp 时记住它们,无论是作为独立模式还是嵌入到另一个模式中。

如果我们看看嵌入后的模式是什么样子,您就可以看到这一点:

/#{ /foo/  }/ # => /(?-mix:foo)/
/#{ /foo/i }/ # => /(?i-mx:foo)/

?-mix:?i-mx: 是这些选项在嵌入式模式中的表示方式。

根据 Options 的正则表达式文档:

i, m, and x can also be applied on the subexpression level with the (?on-off) construct, which enables options on, and disables options off for the expression enclosed by the parentheses.

因此,Regexp 记住了这些选项,即使在外部模式内部,也会导致整个模式无法匹配:

pattern = /A #{ foo_regex }/i # => /A (?-mix:foo)/i
'A Foo' =~ pattern # => nil

可以确保所有子表达式与其周围的模式相匹配,但是这很快就会变得过于复杂或凌乱:

foo_regex = /foo/i
pattern = /A #{ foo_regex }/i # => /A (?i-mx:foo)/i
'A Foo' =~ pattern # => 0

相反,我们有返回模式文本的 source 方法:

/#{ /foo/.source  }/ # => /foo/
/#{ /foo/i.source }/ # => /foo/

嵌入模式内存选项的问题在使用其他 Regexp 方法时也会出现,例如 union:

/#{ Regexp.union(%w[a b]) }/ # => /(?-mix:a|b)/

source 可以帮助:

/#{ Regexp.union(%w[a b]).source }/ # => /a|b/

了解所有这些:

foo_regex = /foo/
pattern = /#{ foo_regex.source }/i # => /foo/i
'A Foo' =~ pattern # => 2

关于ruby - 如何在 Ruby 中的其他正则表达式中嵌入正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43057658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com