4

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

文档中,我刚刚熟悉了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对文档中的单词有任何错误。因此,任何人都可以帮助我了解发生的原因以及为什么会发生这种情况?

而且我也没有找到任何锚的例子\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>

谢谢

4

2 回答 2

7

\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 会很好


更新:现实世界的用途\G

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

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

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

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

红色的

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

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

这种情况一直持续到匹配 'har' 为止,此时会触发否定后视并且匹配失败。因为所有匹配都应该“附加”到最后一个成功的匹配,所以不会匹配其他单词。

结果是:

foo
bar
baz
buz
fuzz
hoo

如果您想反转它并在“har”之后包含所有单词(但同样不包括“har”),您可以使用如下表达式:

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

红色的

这将匹配一个以 'har' 开头的单词或最后一个匹配的结尾(除非我们必须确保不匹配输入的开头)。比赛名单如下:

haz
fil
bil
bak

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

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

红色的

这会产生以下匹配:

har
haz
fil
bil
bak
于 2013-01-16T19:19:08.017 回答
2

听起来您想知道 Regex 是如何工作的?或者你想知道 Regex 如何与 ruby​​ 一起工作?

检查这些。

正则表达式类描述

正则表达式教练- 非常适合测试正则表达式匹配

正则表达式备忘单

我理解 \G 是一个边界匹配字符。所以它会告诉下一场比赛在最后一场比赛结束时开始。也许因为你还没有进行匹配,所以你不能有第二个。

是我能找到的最好的例子。它不是红宝石,但概念应该是相同的。

我收回它,可能更有用

于 2013-01-16T19:18:11.203 回答