1

わかりました、正規表現クックブックからこの例を取得しました

^(?=.{3}$).*

上記の正規表現は、任意のパターンの長さを制限するために使用されます

「aaabbb」をもう一度テストすると、完全に失敗します

私が理解していることから、長さ3の任意の文字が先行する任意の文字を探します.SOは「bbb」と一致する必要がありますが、そうではありません

もう 1 つ質問があります。後読みはこのパターン x(?=x) に従う必要があります。

4

2 に答える 2

6

これは、実際には後読みアサーションではなく、先読みアサーションです。^ は、一致を文字列の先頭に固定し、文字列の先頭の後に 3 文字が続き、その後に文字列の末尾が続く必要があることを表明します。

編集:先読みアサーションは文字を消費しないため、最後の .* がこれらの 3 つの文字に一致するために使用されることにおそらく言及する必要がありました。

于 2010-08-16T18:18:46.733 に答える
4

私が理解していることから、長さ3の任意の文字が先行する任意の文字を探します.SOは「bbb」と一致する必要がありますが、そうではありません

いいえ!詳しく見てみましょう...

^        # The caret is an anchor which denotes "STARTS WITH"
(?=      # lookahead
   .     # wildcard match; the . matches any non-new-line character
    {3}  # quantifier; exactly 3 times
   $     # dollar sign; I'm not sure if it will act as an anchor but if it did it would mean "THE END"
)        # end of lookbehind
.        # wildcard match; the . matches any non-new-line character
 *       # quantifier; any number of times, including 0 times

いくつかの問題:

  1. キャレットでは、文字列の最初の文字である必要があり、最初の文字と最初.*の文字の間に挟まれた文字を後ろから検索しようとしています。^.*
  2. あなたの.{3}実際には、任意の 3 文字を意味し、3 回繰り返される任意の文字ではありません ;) 実際に知りたいのですが、Perl 正規表現で繰り返される文字を見つけるにはどうすればよいですか?
于 2010-08-16T18:22:28.360 に答える