?
다음과 같이 매개 변수가있는 SQL 쿼리에서 자리 표시 자 ( 따옴표없이 맨손으로)를 일치시키고 싶습니다.
UPDATE `table` SET `col1`=? WHERE `col2`=? AND `x`="??as"
( SQL::Parser
대신 사용해야한다는 것을 알고 있습니다. 여기에서 나와 함께합니다.)
이 정규식 (?:`.+?`)|(?:'.+?')|(?:".+?")|(\?)
에 노출 된 물음표와 일치 `col1`=?
하고 `col2`=?
있지만에서 따옴표 안에 물음표을 건너 `x`="??as"
내가 원하는대로. https://regex101.com/r/iH4aV2/3 에서 작동하는 것을 볼 수 있습니다 .
이제 정규식이 PCRE에서 실행됩니다. 이 Perl을 실행하면 :
# same regex and test string
my $x = 'UPDATE `table` SET `col1`=? WHERE `col2`=? AND `x`="??as"';
while ($x =~ /(?:`.+?`)|(?:'.+?')|(?:".+?")|(\?)/g) {
print "A:".pos($x)."\n";
}
나는 얻다:
A:14
A:25
A:27
A:40
A:42
A:50
A:57
나는 regex101 사이트에서와 같이 맨발의 물음표의 위치만을 기대하고 있었다.
A:27
A:42
왜 이런 일이 발생합니까? Perl의 정규식 엔진이 PCRE처럼 작동하도록 할 수 있습니까?
가장 간단한 해결책은 확인하기 전에 캡처하는 괄호가 실제로 무언가를 캡처했는지 확인하는 것입니다 pos
.
my $x = 'UPDATE `table` SET `col1`=? WHERE `col2`=? AND "x"="??as"';
while($x =~ /(?:`.+?`)|(?:'.+')|(?:".+?")|(\?)/g) {
if (defined($1)) {
print "A:".pos($x)."\n";
}
}
이렇게하면 원하는 결과를 얻을 수 있습니다.
( 댓글에 언급 된 공상 (*SKIP)
과 (*FAIL)
동사를 사용할 수 있지만 더 깔끔해 보입니다)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다