4

Ruby1.9.3 を使用しています。私はこのプラットフォームの初心者です。

ドキュメントから、との 2 つanchorに慣れました。定義(EndまたはEnd of String )が混乱したため、それが何を意味するのか理解できません- by 。そこで、以下の小さなスニペットを試しました。でもまだ釣れない。\z\G\zEnd

コード

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


更新: 実世界での使用\G

より現実的な例を思いつきました。よく予測できない任意の文字で区切られた単語のリストがあるとします (またはリストする可能性が多すぎます)。これらの単語を特定の単語まで一致させ、その後はそれ以上単語を一致させたくない場合。例えば:

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

「har」まで各単語を一致させたいとします。「har」またはそれに続く単語のいずれとも一致させたくありません。これは、次のパターンを使用して比較的簡単に行うことができます。

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

紅斑

最初の試行では、入力の先頭に一致し、その後に単語以外の文字が 0 文字続き、その後に 3 つの単語文字 ('foo') が続き、その後に単語境界が続きます。最後に、否定後読みは、一致したばかりの単語が 'har' ではないことを保証します。

2 回目の試行では、一致は最後の一致の最後に戻ります。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

正規表現がどのように機能するか知りたいようですね。または、正規表現がルビーとどのように連携するかを知りたいですか?

これらをチェックしてください。

正規表現クラスの説明

正規表現コーチ-正規表現のマッチングをテストするのに最適

正規表現のチートシート

\Gは境界一致文字であると理解しています。したがって、次の試合は最後の試合の終わりから開始するように指示されます。おそらくあなたはまだ試合をしていないので、あなたは秒を持つことができません。

これが私が見つけることができる最良の例ですそれはルビーではありませんが、概念は同じでなければなりません。

私はそれを取り戻しますこれはもっと便利かもしれません

于 2013-01-16T19:18:11.203 に答える