gpt4 book ai didi

ruby - Anchor\z 和\G 在 Ruby 中是如何工作的?

转载 作者:数据小太阳 更新时间:2023-10-29 07:46:42 27 4
gpt4 key购买 nike

我正在使用 Ruby1.9.3。我是这个平台的新手。

来自doc我刚刚熟悉了两个anchor,它们是\z\G。现在我稍微玩了一下 \z 看看它是如何工作的,因为定义(EndEnd of String)让我感到困惑,我无法理解它的意思 - by 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 词有任何错误。所以任何人都可以帮助我了解发生的原因以及为什么会发生这种情况?

而且我也没有找到 anchor \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>

谢谢

最佳答案

\z 匹配输入的结尾。您正在尝试查找输入末尾出现 4 的匹配项。问题是,输入末尾有一个换行符,所以您找不到匹配项。 \Z 匹配输入的末尾或输入末尾的换行符。

所以:

/\d\z/

匹配“4”在:

"24"

和:

/\d\Z/

匹配上面例子中的“4”和下面的“4”:

"24\n"

查看此问题以使用 \G 为例:
Examples of regex matcher \G (The end of the previous match) in Java would be nice


更新:\G 的实际用途

我想出了一个更真实的例子。假设您有一个单词列表,这些单词由无法很好预测的任意字符分隔(或者列出的可能性太多)。您想要匹配这些单词,其中每个单词都是自己的匹配项,直到一个特定的单词,之后您不想再匹配任何单词。例如:

foo,bar.baz:buz'fuzz*hoo-har/haz|fil^bil!bak

您想匹配每个单词直到“har”。您不想匹配“har”或后面的任何单词。您可以使用以下模式相对轻松地完成此操作:

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

rubular

第一次尝试将匹配输入的开头,然后是零个非单词字符,然后是 3 个单词字符('foo'),然后是单词边界。最后,负向回顾确保刚刚匹配的单词不是“har”。

在第二次尝试时,匹配会在最后一场比赛结束时重新开始。匹配了 1 个非单词字符(',' - 尽管它由于后向查找而未被捕获,这是一个零宽度断言),后跟 3 个字符('bar')。

这一直持续到“har”被匹配,此时负向回顾被触发并且匹配失败。因为所有匹配项都应该“附加”到最后一个成功的匹配项,所以不会匹配其他单词。

结果是:

foo
bar
baz
buz
fuzz
hoo

如果你想反转它并让所有单词都在 'har' 之后(但同样不包括 'har'),你可以使用这样的表达式:

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

rubular

这将匹配紧接在“har”之前的单词或最后一个匹配项的结尾(除非我们必须确保不匹配输入的开头)。匹配列表是:

haz
fil
bil
bak

如果你确实想匹配'har'和后面的所有单词,你可以使用这个:

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

rubular

这会产生以下匹配项:

har
haz
fil
bil
bak

关于ruby - Anchor\z 和\G 在 Ruby 中是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14365969/

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