如何{n}和?<;选项>;:在Ruby 1.9.3环境的“Regexp”中工作

如何{n}和?<;选项>;:在Ruby 1.9.3环境的“Regexp”中工作,ruby,regex,ruby-1.9.3,Ruby,Regex,Ruby 1.9.3,我试图了解Ruby 1.9.3环境下{n}和?:如何在Regexp中工作。但无法理解以下代码如何生成输出: irb(main):001:0> %W{fin\n fi\n\n \n\n fin\r\n find}.grep /f.{2}(?m:.)\Z/ => ["fin\n", "fin\r\n", "find"] irb(main):002:0> %W{fin\n fi\n\n \n\n fin\r\n find}.grep /f.{1}(?m:.)\Z/ => ["f

我试图了解Ruby 1.9.3环境下
{n}
?:
如何在
Regexp
中工作。但无法理解以下代码如何生成输出:

irb(main):001:0> %W{fin\n fi\n\n \n\n fin\r\n find}.grep /f.{2}(?m:.)\Z/
=> ["fin\n", "fin\r\n", "find"]
irb(main):002:0> %W{fin\n fi\n\n \n\n fin\r\n find}.grep /f.{1}(?m:.)\Z/
=> ["fin\n", "fi\n\n"]
irb(main):003:0> %W{fin\n fi\n\n \n\n fin\r\n find}.grep /f.{1}(?m:.)\Z/
=> []
irb(main):010:0> %W{fin\n fi\n\n \n\n fin\r\n find}.grep /f.(?m:.)\Z/
=> ["fin\n", "fi\n\n"]
irb(main):011:0> %W{fin\n fi\n\n \n\n fin\r\n find}.grep /f.(m:.)\Z/
=> []
irb(main):012:0> %W{fin\n fi\n\n \n\n fin\r\n find}.grep /f.(?m:.)\z/
=> []
有谁能帮助我理解上述代码是如何在
IRB
终端中生成上述输出的

谢谢


根据@Kevin最后一段我尝试了以下内容,并找到了预期和理想的结果:

irb(main):014:0> %W{fin fi\n\n \n\n fin\r\n find}.grep /f.(?m:.)\z/
=> ["fin"]
irb(main):015:0> %W{fin fi\n\n \n\n fin\r find}.grep /f.(?m:.)\z/
=> ["fin"]
irb(main):016:0> %W{fin fi\n \n\n fin\r\n find}.grep /f.(?m:.)\z/
=> ["fin", "fi\n"]
irb(main):017:0> %W{fin fi\n \n\n fr\n find}.grep /f.(?m:.)\z/
=> ["fin", "fi\n", "fr\n"]
irb(main):018:0>
非常感谢你@Kevin。你帮助我理解了整个概念

{n}
表示“重复上一个原子
n
次”。在正则表达式中,原子是一个自包含的单元。所以单个字符就是一个原子。圆点也是。组也是一个原子(包含其他原子),字符类也是。所以
{n}
表示“匹配
n
字符”(因为
表示“匹配任何字符”)

请注意,
{n}
不像反向引用,因为它不必在每次重复时匹配相同的文本
{5}
的行为与
..
完全相同

这种构造也更强大。它可以包含两个数字,并匹配整个范围的重复计数。所以
{3,5}
的意思是“匹配3到5个字符”。而
{3,}
表示“匹配3个或更多字符”<代码>?可以替换为
{0,1}
*
替换为
{0,}
+
替换为
{1,}
,如果需要的话



Ruby中的
m
选项实际上是DOTALL选项,它允许
匹配
\n
。(不知道为什么Ruby在这一点上有所不同)。你的意思是不是说
{n}
而不是
(n)
(使用
n
任何数字)?@Tintorius抱歉!我现在改正了。作为一个新手,我不能排除我描述中提到的代码。但我从你的帖子里得到了这个理论。你能用我的密码解释一下吗?希望这能从各个方面澄清我的想法。请?@DoLoveSky:我刚刚编辑了我的帖子,解释了你给出的每一个例子。是的,我很高兴看到你的帖子,同时也了解了你发布的理论和代码!非常感谢!请做我的老师,:)我是这个平台的新手,渴望从根本上学习它!希望我能做到,如果你们能帮忙的话!终于
+1
感谢你来照顾我的帖子@多洛夫斯基:熟悉正则表达式的最好方法就是继续使用它们。每次您看到一个,确保您准确地理解它在做什么,即使这意味着打印出regexp语法并将其贴在监视器旁边。请注意,有许多不同的regexp引擎,每个引擎都有各自不同的行为,所以暂时只使用ruby代码中的regexp。@DoLoveSky:当然要注意,如果删除
\Z
,那么“find”将匹配,因为模式不再锚定。类似地,如果将
f
替换为
,则“find”将匹配,因为模式将匹配“ind”。但是对于初始的
f
\Z
锚,“find”根本不起作用。
> %W{fin\n fi\n\n \n\n fin\r\n find}.grep /f.{2}(?m:.)\Z/
=> ["fin\n", "fin\r\n", "find"]
> %W{fin\n fi\n\n \n\n fin\r\n find}.grep /f.{1}(?m:.)\Z/
=> ["fin\n", "fi\n\n"]
> %W{fin\n fi\n\n \n\n fin\r\n find}.grep /f.{1}(?m:.)\Z/
=> []
> %W{fin\n fi\n\n \n\n fin\r\n find}.grep /f.(?m:.)\Z/
=> ["fin\n", "fi\n\n"]
> %W{fin\n fi\n\n \n\n fin\r\n find}.grep /f.(m:.)\Z/
=> []
> %W{fin\n fi\n\n \n\n fin\r\n find}.grep /f.(?m:.)\z/
=> []