正規表現のエスケープされた/は、4.をみるとsの手前の位置を走査しているようにみえます。なぜ、sそのものを調べるのではなく単語境界の\bや先読みのようにsの手前にあたる位置を調べようとするのでしょうか。
正規表現は最初の1文字目から1文字ずつ、マッチする文字列集合を見つけようとするため、最初の単語usr
の単語境界↓usr
の「↓」位置にマッチしますが、その次の正規表現は/
なので、usr
にはマッチしません。
※「↓」記号は単語境界(記号は含まない)の意味
試しに、最初の正規表現パターンの\b
がusr
の最初にマッチしていることを確認するために、下記のように入力してみてください。下記どれでも同じ結果になります。
- \busr/
- /\busr/
- /\busr\b/
下記の正規表現の意味は「↓/ゼロ個以上の文字列」となります。
全文を図式で表すと下記のようになります。
^/↓usr↓/↓local↓/↓bin↓/↓gcc↓$
※上記「↓」記号は単語境界(記号は含まない)の意味
正規表現の\b
は単語境界(記号は含まない)なので、自然な正規表現を書くのであれば下記のようにします。下記のように書くと、/usr/, /bin/
にマッチします。//g
フラグなしの場合は/usr/
のみにマッチします。
また5行目でバックトラック(赤い矢印の部分)が発生していますが、*や+のような量指定子以外でもバックトラックは発生するのでしょうか。
この場合のバックトラックは、あくまでも指定の正規表現が最初の/usr
でマッチしなかったので、マッチするまで最初からマッチさせようとしていることを示すものです。そして、\b/\w*
で↓/local
にマッチしたというわけです。
ちなみにこの正規表現の動作はPHP
、Perl
、JavaScript
、sed
などでも同じように振舞います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。