如何锚\\ Z和\\的G Ruby的作品?(How the Anchor \\z and \\G w

2019-07-18 06:58发布

我使用Ruby1.9.3。 我是新手到这个平台。

从文档我刚刚familiared有两个anchor\z\G 。 现在我有点玩\z看看它是如何工作的,如( 字符串结束或者结束 )的定义让我困惑,我不明白是什么意思说-按End 。 所以,我想下面的小片段。 但仍无法赶上。

irb(main):011:0> str = "Hit him on the head me 2\n" + "Hit him on the head wit>
=> "Hit him on the head me 2\nHit him on the head with a 24\n"
irb(main):012:0> str =~ /\d\z/
=> nil

irb(main):013:0> str = "Hit him on the head me 24 2\n" + "Hit him on the head >
=> "Hit him on the head me 24 2\nHit him on the head with a 24\n"
irb(main):014:0> str =~ /\d\z/
=> nil

irb(main):018:0> str = "Hit1 him on the head me 24 2\n" + "Hit him on the head>
=> "Hit1 him on the head me 24 2\nHit him on the head with a11 11 24\n"
irb(main):019:0> str =~ /\d\z/
=> nil
irb(main):020:0>

每次我一nil作为输出。 因此,计算是怎么回事了\z ? 是什么End是什么意思? -我觉得我的概念了什么毛病End在doc字。 因此,任何人可以帮助我了解什么与为什么这么发生发生的原因是什么?

还有,我也没有找到锚任何例子\G 。 从你的人的任何实例,请做出直观了解\G实时编程中使用?

编辑

irb(main):029:0>
irb(main):030:0*  ("{123}{45}{6789}").scan(/\G(?!^)\{\d+\}/)
=> []
irb(main):031:0>  ('{123}{45}{6789}').scan(/\G(?!^)\{\d+\}/)
=> []
irb(main):032:0>

谢谢

Answer 1:

\z输入的端部相匹配。 你正在努力寻找其中4发生在输入的最后一场比赛。 问题是,有在输入的最后一个换行,这样你就不会找到匹配。 \Z输入的任一末端或在输入的端部的换行匹配。

所以:

/\d\z/

匹配“4”:

"24"

和:

/\d\Z/

在上述例子中,并在“4”相匹配的“4”:

"24\n"

退房例如使用的这个问题\G
在Java中的正则表达式匹配\ G(以前匹配的端部)的实例将是很好


更新:现实世界用来\G

我想出了一个更真实的例子。 假设你有由不能很好地预测(或有太多的可能性,列出)任意字符分隔的单词的列表。 你想匹配这些话,每​​个字是自己的比赛,直到一个特定的词,之后你不想匹配任何更多的话。 例如:

FOO,bar.baz:buz'fuzz *吵吵闹闹/就绪| ^大象知道你看!

你想每一个字,直到“哈日”相匹配。 你不想匹配“哈日”或任何的后面的话。 为此,您可以相对容易地使用下面的模式:

/(?<=^|\G\W)\w+\b(?<!har)/

rubular

第一次尝试将匹配输入后面的零非字字符,接着是3个字的字符(“富”),接着在字边界的开头。 最后,负回顾后确保刚刚被匹配的词不是“哈日”。

在第二次尝试,匹配精选在最后一场比赛结束备份。 1非单词字符匹配(“” - 尽管它不是捕获由于回顾后,这是一个零宽度断言),其次3个字符(‘巴’)。

这一直持续到“哈日”匹配,此时负回顾后触发和匹配失败。 因为所有的比赛都应该被“附加”到最后成功的匹配,不需要额外的话会被匹配。

其结果是:

foo
bar
baz
buz
fuzz
hoo

如果要扭转这种局面,并有所有单词后“哈日”(但同样,不包括“哈日”),你可以使用这样的表达式:

/(?!^)(?<=har\W|\G\W)\w+\b/

rubular

这将匹配即将由“哈日”或最后比赛结束preceeded(除非我们必须确保不匹配输入的开始)一词。 比赛的名单是:

haz
fil
bil
bak

如果你想匹配“哈日”和所有下面的话,你可以这样做:

/\bhar\b|(?!^)(?<=\G\W)\w+\b/

rubular

这将产生以下的比赛:

har
haz
fil
bil
bak


Answer 2:

听起来像是你想知道正则表达式是如何工作的? 或者你想知道正则表达式如何与红宝石?

检查这些了。

RegExp类的说明

正则表达式教练 -伟大的测试正则表达式匹配

正则表达式小抄

我明白\克至是边界匹配字符。 因此,它会告诉下一场比赛在最后一场比赛结束时开始。 也许因为你还没有做的比赛还没有你不能有第二次。

这是我能找到的最好的例子。 它不是在Ruby,但这个概念应该是相同的。

我收回这可能是更有益



文章来源: How the Anchor \\z and \\G works in Ruby?