패턴 서브 루틴 이름을 사용하여/'서브 루틴'정규식 PHP의 PCRE 기능과 누군가가 다음과 같은 이상한 출력 설명 할 수 있겠죠 :PCRE 정규 표현식 내가 명명 된 서브 패턴을 실험하고
$re = "/
(?(DEFINE)
(?<a> a)
)
^(?&a)$
/x";
var_dump(preg_match($re, 'a', $match)); // (int) 1 as expected
var_dump($match); // Array([0] => 'a') <-- Why?
은 그럴 수 없어 명명 된 그룹 "a"가 결과에없는 이유 (내용 "a"포함)를 이해합니다. preg_match
에서 preg_match_all
으로 변경하면 "a"와 "1"이 일치 데이터에 포함되지만 둘 다 빈 문자열 만 포함됩니다. 서브 패턴이 일치하는 데이터에 사용할 수없는 그러나 경우
정말 당신이 그 (것)들을 아주 유지 보수 (이것의 좋은 예를 들어 this answer 참조) 유지하는 동안 그들을 믿을 수 없을만큼 강력 할 수 있습니다,이 방법은 정규 표현식을 작성하는 생각처럼, 그럼별로 쓸모가 없습니다.
여기에 뭔가가 누락되었거나 내가 할 수있는 일을 슬퍼해야합니까?
네, 맞습니다. 이것은'(? (DEFINE) ...)'이 작동하는 방식입니다. 서브 루틴을 선언하고 싶습니다. 나는 때로는 내 머리 속에 두 가지를 유지하기 위해, 정의 할 수없는 캡쳐 그룹과 캡쳐 할 수없는 캡쳐 링 그룹을위한 소문자로 모두 캡을 사용한다. 주어진 해결책의 더 이상을보십시오 [이 답변에서] (http://stackoverflow.com/questions/4284176/doubt-in-parsing-data-in-perl-where-amgoing-wrong/4286326# 4286326) 두 가지 방법으로 명명 된 그룹을 사용하는 방법 : 호출 및 캡처. 캡쳐 된 것들은'$ + {VALUE} '나'@ + {qw}'와 같은'% +'해시를 빠져 나옵니다. –
tchrist
이 문제를 해결해 주셔서 감사합니다. – connec