6

正規表現:(?=(\d+))\w+\1 文字列:456x56

やあ、

この正規表現が文字列「456x56」の「56x56」とどのように一致するかという概念がわかりません。

  1. ルックアラウンド(?=(\ d +))は、456をキャプチャし、\ 1に入れて(\ d +)
  2. 単語文字\w+は、文字列全体に一致します( "456x56")
  3. \ 1は456であり、その後に\w+を続ける必要があります
  4. 文字列をバックトラックした後、単語文字の前に「456」がないため、一致するものが見つからないはずです。

ただし、正規表現は56x56に一致します。

4

5 に答える 5

7

5)正規表現エンジンは、4から検索を開始すると一致するものが見つからないと判断したため、1文字スキップして再度検索します。今回は、2桁をキャプチャして\1、一致するようになります56x56

文字列全体のみを照合する場合は、^(?=(\d+))\w+\1$

^ matches beginning of string
$ matches end of string
于 2012-01-07T13:26:10.950 に答える
6

言われているように、正規表現を固定しません。もう1つの問題は、\w数字も一致することです...次に、正規表現エンジンがどのように入力と一致するかを見てみましょう。

# begin
regex: |(?=(\d+))\w+\1
input: |456x56
# lookahead (first group = '456')
regex: (?=(\d+))|\w+\1
input: |456x56 
# \w+
regex: (?=(\d+))\w+|\1
input: 456x56|
# \1 cannot be satisfied: backtrack on \w+
regex: (?=(\d+))\w+|\1
input: 456x5|6 
# And again, and again... Until the beginning of the input: \1 cannot match
# Regex engine therefore decides to start from the next character:
regex: |(?=(\d+))\w+\1
input: 4|56x56
# lookahead (first group = '56')
regex: (?=(\d+))|\w+\1
input: 4|56x56
# \w+
regex: (?=(\d+))\w+|\1
input: 456x56|
# \1 cannot be satisfied: backtrack
regex: (?=(\d+))\w+|\1
input: 456x5|6
# \1 cannot be satisfied: backtrack
regex: (?=(\d+))\w+|\1
input: 456x|56
# \1 satified: match
regex: (?=(\d+))\w+\1|
input: 4<56x56>
于 2012-01-07T15:29:07.020 に答える
0

あなたがリストしたポイントはほぼ完全に間違っていますが、完全に間違っているわけではありません!

 1) The group  (?=(\d+)) matches a sequence of one or more digits
    not necessarily 456 
 2) \w captures only characters, not digits 
 3) \1 the is a back reference to the match in the group

したがって、役割式とは、数字のシーケンスの後に単語文字のシーケンスが続き、その後に文字の前で見つかったのと同じシーケンスが続くことを意味します。したがって、56x56に一致します。

于 2012-01-07T13:28:38.293 に答える
0

まあそれはそれを前向きな先読みにするものです

 (?=(\d+))\w+\1

最初の\d+が456と一致すると言うときは正しいので、\ 1も456である必要がありますが、その場合、式は文字列と一致しません。

xの前とxの後の唯​​一の一般的な文字は56であり、それが正の一致を得るために行うことです。

于 2012-01-07T13:29:32.263 に答える
0

オペレーター+は貪欲で、必要に応じて後戻りします。先読み(?=(\d+))は、正規表現が失敗した場合は456、次に56に一致し、正規表現が失敗した場合は6に一致します。最初の試行:456。一致します。グループ1には456が含まれます。次に\w+、貪欲で456x56を取るものがありますが、何も残っていませんが、一致する必要があり\1ます。つまり、456です。したがって:失敗。次に\w+、正規表現の先頭に到達するまで、一度に1ステップずつバックトラックします。そしてそれはまだ失敗します。

文字列から文字を消費します。次のバックトラックは、サブストリング56と先読み一致を試みています。これは一致し、グループ1には56が含まれ\w+ています。ストリングの終わりまで一致し、456x56を取得してから、56:失敗と一致しようとします。したがって\w+、文字列に56が残ってから、グローバルマッチと正規表現の成功が得られるまで、bactracksを実行します。

正規表現バディデバッグモードで試してみてください。

于 2012-01-07T19:02:00.530 に答える