何时使用Regexp.new()?

时间:2014-05-29 08:09:53

标签: ruby regex

我找不到任何正确答案,因为Regexp代表正则表达式。这是一个例子:

test = Regexp.new("Hello")

它返回/Hello/,但我对此的使用感到困惑。为什么不直接使用/Hello/?任何人都可以给我一个Regexp.new()函数的小例子吗?

3 个答案:

答案 0 :(得分:3)

想象一下,您有一个带有字符串的变量,您希望在正则表达式中重用该字符串:

a_string = "I want to match this"

然后,您可以使用以下方法轻松创建正则表达式:

Regexp.new(a_string)

答案 1 :(得分:3)

让我们想象你想让你的系统检测到一个以DOG开头并以CAT"结尾的句子。明显的正则表达式就像/DOG.+CAT\./ [1]。

到目前为止,作品。但是现在您希望能够增强系统,因此用户可以配置打开和关闭单词。您可以使用//语法和插值来执行此操作:

/#{startWord}.+#{endWord}\./

但您也可以使用简单的字符串:

Regex.new(startWord + ".+" + endWord + "\.")

化妆品。使用你最喜欢的。但是,还有一件事非常重要。使用new功能,您不仅可以传递一个,还可以传递更多参数。见the docs

因此,从你的角度来看,new存在的主要目的实际上是能够传递更多的参数而不仅仅是一个。使用//,您只能传递正则表达式[3]。使用new,您可以传递选项。

为清晰起见,很少有细节过于简单 [1]它不是一个有效的"句子检测器"。显示问题只是一些正则表达式 [2]这不是主要目的。 new构造函数。它必须存在或者我们无法构造对象。实际上,/blargh/语法已转换为new调用 [3]实际上,使用//,您也可以传递一些选项,例如/CaSEiNseNsiTive/i。但是,构造者仍然更加灵活。

答案 2 :(得分:2)

文字可以访问所有构造函数功能。实际上,文字允许您指定甚至更多选项而不是new

# Supported by Regexp.new

/regexp/m  =>  Regexp::MULTILINE
/regexp/i  =>  Regexp::IGNORECASE
/regexp/x  =>  Regexp::EXTENDED
/regexp/n  =>  Regexp::NOENCODING

# Apparently only available to literals

/regexp/u  =>  UTF-8
/regexp/s  =>  Windows-31J
/regexp/e  =>  EUC-JP
/regexp/o  =>  Interpolate only once; only makes sense in literals

为什么有很多编码选项?原因是通过文字创建的正则表达式对象假定源代码的编码;存在强制特定编码的编码选项。构造函数允许您传入一个可以显式控制其编码的任意字符串。

当正则表达式具有动态特性时,new方法非常有用。虽然可以将字符串插入文字:

string = '.+'
regexp = /#{string}/

无法将选项插入到文字中。没有这样的事情:

options = 'ui'
regexp = /.+/#{options}

在这里使用构造函数是有利的,因为它可以让您决定动态传递哪些选项。如果您要创建一个允许用户通过图形用户界面创建自己的正则表达式的程序,那么使用Regexp.new创建正则表达式是很自然的。