「<」と「\?」が奇妙に一致する正規表現

「<」と「\?」が奇妙に一致する正規表現

簡単なテストPHPスクリプトがあるとしましょう。

<?php
$a = ($argc == 2 ? $argv[1] : 10);
for ($i = 0; $i < $a; $i++) {
  echo '.';
}
echo PHP_EOL;

これで、ファイルに対してgrepまたは条件付きsedを実行します。

grep '<' test.php

含まれている2行を作成します<。非常に明確です。

grep '\?' test.php

疑問符を含む2行を生成します。非常に明確です。

grep '<\?' test.php

すべての行を返します。なぜですか?最初の行だけを出力すると予想しました。しかし、<エスケープする必要があるかもしれません。これにより、予期しない別の出力が生成される可能性があります。

sed -n '/pattern/p' test.php

同じ結果が生成されます。

私はから答えを得ようとしています。https://regex101.com/しかし、驚くべきことに、ウェブサイトには私が期待した内容が出ていました。また、grep私が期待した結果を生成した高速で汚れたPHPの実装は次のとおりです。

<?php
if (($fh = fopen($argv[2], 'r')) !== false) {
  while ($line = fgets($fh)) {
    if (mb_ereg($argv[1], $line) !== false) echo $line;
  }
}

grep私の質問は:この一致の合計が一致するのはなぜですかsed

ベストアンサー1

grepのデフォルト動作は、正規表現を次のように解釈することです。基本正規表現(BRE)。これは特殊記号ではサポートされていません?。これは基本機能です。

grep '<?' test.php

したがって、所望の結果を得ることができる。

GNUはgrep拡張正規表現では特別な意味を持ちますが、BREではそうでないシンボルのエスケープバージョンを扱います。BREでも特殊記号で、これは\?EREとBREで同じ意味を持ちます。?したがって、grep '<\?'0または1と一致すると、<すべての項目と一致します(<またはカラー出力が有効な場合は強調表示されます)。

同じ推論が適用されます。sed

おすすめ記事