"<" 및 "\?"가 이상하게 일치하는 정규식

"<" 및 "\?"가 이상하게 일치하는 정규식

간단한 테스트 PHP 스크립트가 있다고 가정해 보겠습니다.

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

이제 파일에 대해 grep 또는 조건부 sed를 수행합니다.

grep '<' test.php

포함된 두 줄을 생성합니다 <. 매우 명확한.

grep '\?' test.php

물음표가 포함된 두 줄을 생성합니다. 매우 명확한.

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.

관련 정보